2016-04-05 21 views
0

私は製品とオーダーのモデルが必要な場所にレールアプリを構築しています。オーダー、製品、オーダー製品モデルの関連

私は論理パスが注文が多く、私はproduct_idを入れている発注される製品、order_id(2つの他のモデルに一致する)とamountフィールドを持つことができるので、OrdersProductと呼ばれる別のモデルを、持っていると思います。

私の問題は、OrdersProductレコードから各商品情報にアクセスする方法です。

ポイントは、私は私のOrdersProductモデルにbelongs_to :product関連付けを行うことができますが、それは私のProductモデルでhas_many :orders_productsを入れて任意の理にかなっていません。

モデルのようなものに思える:

class Customer < ActiveRecord::Base 
    # id 
    # name 
    # etc… 
end 

class Product < ActiveRecord::Base 
    # id 
    # name 
    # etc… 
end 

class Order < ActiveRecord::Base 
    # id 
    # customer_id 
    # etc… 
end 

class OrdersProduct < ActiveRecord::Base 
    # order_id 
    # product_id 
    # amount 
end 

Order.productsへのアクセス権を持っているとOrdersProductモデルに関連する製品のコレクションを取得するための最良の方法は何ですか?

答えて

-1

あなたが欲しいのは、Has and belongs to many throughの関連付けを使用することです。

class Order < ActiveRecord::Base 
    has_many :orders_products 
    has_many :products, through: :orders_products 
end 

class Product < ActiveRecord::Base 
    has_many :orders_products 
    has_many :orders, through: :orders_products 
end 

class OrdersProduct < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :product 
end 

は今商業用語で、製品はしばしば LineItemとして参照されているので、代わりに orders_productsテーブルを使用してのあなたは line_itemsテーブルを指定することができ命じました。

class Order < ActiveRecord::Base 
    has_many :line_items 
    has_many :products, through: :line_items 
end 

class Product < ActiveRecord::Base 
    has_many :line_items 
    has_many :orders, through: :line_items 
end 

class LineItem < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :product 
end 
+0

ありがとう、非常に正確です。私は少しそれを試してみましょう! – fall

+0

def Order neo

+0

間違いに気づいてくれてありがとう。私は答えを入力するときに急いでいた。 –

-1

OrdersProductモデルを取り除くことができます。

ちょうど次のモデルが必要になります。

class Customer < ActiveRecord::Base 
    has_many :orders 
    # id 
    # name 
    # etc… 
end 

class Order < ActiveRecord::Base 
    belongs_to :customer 
    has_many :products 

    # id 
    # customer_id 
    # etc… 
end 

class Product < ActiveRecord::Base 
    belongs_to :order 

    # id 
    # name 
    # order_id 
    # etc… 
end 

だから今、あなたはcustomerorderがインスタンスであることを考えるとcustomer.orders.first.productsまたはorder.productsを呼び出すことができます。

+0

これは役に立たないと思います。多対多の関係を処理し、接続に関する追加情報(ammount、discountなど)を追跡するには、結合モデルが必要です。 –

+0

私の例では多対多関連はどこにありますか? – neo

+0

どこにも、それが役に立たないと思う理由はありません。 –

関連する問題