2011-02-06 2 views
19

申し訳ありません。私は多対多関係なので、2つのテーブルと結合テーブルを持っています。私には注文があり、注文には多くの商品があります。明らかに、それは製品が多くの注文になる可能性があるため、他の方法になります。私は、次のクラスを持っている:Rails 3 has_many:命名問題を通して

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

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

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

私は表示するページを取得していると私はものを入力することだと私は@order.products経由で保存されたオーダーの製品と対話するために行くとき、私は取得しています次のエラー:

SQLite3::SQLException: no such table: order_products: SELECT "products".* FROM "products" INNER JOIN "order_products" ON "products".id = "order_products".product_id WHERE (("order_products".order_id = 1)) 

がテーブルに参加マイはorders_products命名されていますが、order_productsて参加しようとして見ることができるように。私の限られたRails命名規則の知識では、orders_productsという名前で正しい名前をつけて、OrderProductという名前を付けています。私は本当にこの壁の壁に頭を打っています。

EDIT:私の注文を保存したにもかかわらず複数のチェックボックスを選択しても、orders_productsテーブルに値が保存されていないことがわかります。おそらく今のエラーと同じ理由が考えられます。

答えて

27

orders_productshas_many :through関係の正しい命名規則ではありません - それhas_and_belongs_to_many関係の正しいです。 has_many :throughでは、「結合」モデルは結合のためのものではなく、それ自体のデータを持つ独自のモデルであり、も発生し、他の2つのモデルを一緒に結合するのがです。

OrderProductモデルにデータ、ロジック、または制約がない場合は、代わりにhas_and_belongs_to_manyの関係を使用して、モデルを完全に削除してから、結合表の名前をrightにすることができます。それ以外の場合は、通常のモデル命名規則、すなわちorder_productsに従って命名されます。

+0

適切な 'has_many:through'関連の例については、[このトピックのガイド](http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association)を参照してください。 –

+3

ああ、私はhabtmが非難されたと思った。 – MattC

+0

しかし、それは私の問題を修正したようだ、あなたは星を得る。また、受け入れられた答えのための5点:D – MattC

関連する問題