0

我有一個組織,有很多產品。這些產品有多種類別。還有不止一個組織。一個產品可以在多個類別中。Rails協會(多對多的噩夢)

將如何設置我的模型和協會,這樣我可以做到以下幾點:

@org = Organisation.first 

@org.categories => spits out a list of categories being used by the products for that organisation 
@org.products => spits out a list of products for that organisation 
@org.categories[0].products => spits out a list of products for the first category 

另外,我想的類別,以提供給其他組織,這樣,如果我碰巧創建類在組織1添加產品時,則該類別也將提供產品,我增加了對組織2

回答

2

這可能是你應該如何設置你的模型(docs):

編輯:更新答案

class Organisation < ActiveRecord::Base 
    has_many :products 

    def categories 
    # I don't like this way anymore 
    # @_categories ||= products.map(&:categories).flatten.uniq 
    # Do this 
    @categories ||= Category.for_organisation(self) 
    end 
end 

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories # foreign keys in the join table 
    # A product references an organisation. 
    belongs_to :organisation    # foreign key - organisation_id 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products # foreign keys in the join table 

    def self.for_organisation(org) 
    query = %{ 
     id in (
     select category_id from categories_products where product_id in (
      select id from products where organisation_id = ?)) 
    } 
    where(query, org.id) 
    end 
end 

可能的疑難雜症:這需要沒有相應的模型或主鍵

下面是一個example app使用這種技術連接表。自述會幫助你開始。

+0

你的'has_many:through'對我來說很好看。 – jaredonline 2011-05-19 01:53:49

+0

我創建了一個規範https://gist.github.com/980044來測試這個,大部分工作正常!謝謝! 但是,第20行失敗,出現錯誤:Invalid source reflection macro:has_and_belongs_to_many for has_many:categories,:through =>:products。使用:source來指定源反射。 – robzolkos 2011-05-19 02:18:32

+0

@RobZolkos很高興我能幫上忙。 – dwhalen 2011-05-19 02:27:27