2016-03-27 13 views
1

私の結合テーブルは、元の2つのテーブルから自動集計されません。私は無用にさまざまな方法でそれを接続しようと約5時間を費やしました。私のコードに関するすべてのガイダンスは高く評価されます。Rails - 結合テーブルは自動集計されません

ここに私のコードです。

最初の項目:

`class Order < ActiveRecord::Base 

    belongs_to :orders_users 
    has_many :users, :through => :orders_users 

    validates :item, presence: true 

end 

def add_order(order) 
end 

def remove_order(order) 
end 

` 

第2項:

class User < ActiveRecord::Base 
    belongs_to :orders_users 
    has_many :orders, :through => :orders_users 

    validates :username, presence: true, uniqueness: true 
    has_secure_password 
end 

移行:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :users, :orders do |t| 
     t.index [:user_id, :order_id] 
     t.index [:order_id, :user_id] 
    end 
    end 
end 

受注コントローラー:

class OrdersController < ApplicationController 


    def new 
    binding.pry 
    @order = Order.new 
    end 

    def create 
    @order = Order.new(order_params) 
    if @order.save 
     redirect_to request.referer 
    else 
     redirect_to root_path 
    end 
    end 

    def show 
    @order 
    end 

    private 

    def order_params 
    params.require(:order).permit(:item) 
    end 



end 
人の

ユーザーコントローラー:

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 

    if @user.save 
     session[:current_user_id] = @user.id 
     redirect_to user_path(@user) 
    else 
     redirect_to new_user_path(@user) 
    end 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def destroy 
    @user = User.find(params[:id]) 
    session[:current_user_id] = nil 
    @user.destroy 
    redirect_to root_path 
    end 


    def index 
    @user 
    end 

    private 

    def user_params 
    params.require(:user).permit(:username, :password,:password_confirmation) 
    end 


end 
+1

そのビットは不明案内

class OrdersController < ApplicationController def new @order = Order.new end def create @order = Order.new(order_params) @order.users.build(current_user) #current_user is a function returning the signed in user if @order.save redirect_to request.referer else redirect_to root_path end end def show @order end private def order_params params.require(:order).permit(:item) end end 

。あなたはこれで達成したいことを説明できますか? –

+0

お返事ありがとうございます。私がしようとしていることは次のとおりです。ユーザーがデータベースに項目を挿入すると、どのユーザーがどの項目をデータベースに入力したかを記録する結合表が必要になります。それは私の質問を明確にしますか? – CodeYogi

+0

私はafter_saveフィルターが、あなたが必要とするものを順番に実行すると思います。あなたはそれを試しましたか? –

答えて

1

あなたはOrderの団体やUserモデルを混合しています。

2つのオプションがあります。

  1. "を通じて、多くを持っている" と

オプション1 をごjointableを取り外し、新しい "本物" OrderUserモデルを作成HABTM(持ち、多くに所属)

  • を使用すると削除これにあなたのUserOrderモデルを変更します。

    class Order < ActiveRecord::Base 
        has_and_belongs_to_many :users 
    
        validates :item, presence: true 
    
        def add_order(order) 
        end 
    
        def remove_order(order) 
        end 
    
    end 
    
    class User < ActiveRecord::Base 
        has_and_belongs_to_many :orders 
    
        validates :username, presence: true, uniqueness: true 
        has_secure_password 
    end 
    

    オプション2 has_manyから

    belongs_toの代わりにhas_manyである必要があります。

    class Order < ActiveRecord::Base 
        has_many :order_users 
        has_many :users, :through => :order_users 
    
        validates :item, presence: true 
    
        def add_order(order) 
        end 
    
        def remove_order(order) 
        end 
    
    end 
    
    class User < ActiveRecord::Base 
        has_many :order_users 
        has_many :orders, :through => :order_users 
    
        validates :username, presence: true, uniqueness: true 
        has_secure_password 
    end 
    

    ロールバックあなたはjointable

    rake db:rollback 
    

    JoinTable移行と古い移行ファイルを削除する削除するDB。

    rails g model OrderUser order:references user:references 
    rake db:migrate 
    

    「を通じてhas_manyの」レールコンソールを使用し

    ActiveRecordの関係を確認する方法についてのヒント、あなたが持っていない、そのようにするために使用する「本物」のモデルを作成します。コントローラが正しく動作することを心配する必要があります。小さな例:オーダーを作成する場合は

    rails c 
    > u = User.create username: "test" 
    > o = u.orders.new item: "test-item" 
    > o.save 
    

    を編集ご注文コントローラ

    ご注文・オブジェクトにCURRENT_USERを指定する必要があります。この例では、current_userを使用して署名付きのユーザーを取得しています。アプリに応じて、これを変更する必要があります。 Railsのからいくつかの情報を約has_many through

  • +0

    あなたが役に立たないと言ったように私はやった。他の提案は非常に高く評価されるだろう。たぶん私は略語のためにあなたのコードで何かをキャッチしていない。ありがとう。 – CodeYogi

    +0

    私は答えとその例を少し明確にしました。主なことは、JoinTableの移行を使用する場合、「has_many through」を使用しないでください。 –

    +0

    ありがとう、Jacob。私がしようとしていることは次のとおりです。ユーザーがデータベースに項目を挿入すると、どのユーザーがどの項目をデータベースに入力したかを記録する結合表が必要になります。それは私の質問を明確にしますか? – CodeYogi

    関連する問題