9

カテゴリ、製品、ブランドの間に次の関係があります。

class Brand < ActiveRecord::Base
  has_many :products
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
  belongs_to :brand
end

このリレーションを使用して、指定したブランドですべてのカテゴリを選択するにはどうすればよいですか? 私はこれを試しますが、エラーが発生します

b = Brand.find(1)
Category.joins(:products).where(:products => b.products)
4

2 に答える 2

10

結合で正しいことを行いました。より複雑な where 定義を追加するだけです。

Category.joins(:products).where(:products => {:brand_id => 1})
于 2013-01-09T19:34:34.063 に答える
4

物議を醸すように、HABTM が良い設計であることはめったになく、Rails が間違っていたのは IMO だけです。

製品とカテゴリを結合する xref テーブルを導入し、関係の両側で has_many :through を使用して、最終的に

class Brand < ActiveRecord::Base
  has_many :products
  has_many categories :through => products # This is now allowed in Rails 3.x and above
end

class Category < ActiveRecord::Base
  belongs_to :product_category
  has_many :products :through => product_category 
end

class Product < ActiveRecord::Base
  belongs_to :brand
  belongs_to :product_category
  has_many :categories :through => product_category
end

class ProductCategory < ActiveRecord::Base
  has_many :products
  has_many :categories
end

これにより、最小限のコード リファクタリングで最高の柔軟性が得られ、関係の両側で必要なデータを取得するためのはるかに直感的なパスが提供され、次のことが可能になります。

b = Brand.find(1)
b.categories.all

更新 上記は完全にテストされていないコードであり、私が犯した明らかにばかげた間違いを修正したところです。これの実装に問題がある場合は、戻ってきてください

于 2013-01-09T19:32:35.147 に答える