2012-06-09 69 views
1

我試圖檢查現有InvitationSearch記錄具有完全相同的關聯之前創建一個新的(以避免有2記錄是相同的),但我可以不知道該怎麼做。查找具有has_many確切集合的記錄:通過關聯ID

class InvitationSearch < ActiveRecord::Base 
    has_many :invitations 
    has_many :brands, :through => :invitation_search_brands 
    has_many :invitation_search_brands 
    has_many :categories, :through => :invitation_search_categories 
    has_many :invitation_search_categories 
    has_many :sizes, :through => :invitation_search_sizes 
    has_many :invitation_search_sizes 
end 

class Invitation < ActiveRecord::Base 
    belongs_to :invitation_search 
end 

class InvitationSearchSize < ActiveRecord::Base 
    belongs_to :invitation_search 
    belongs_to :size 
end 

class InvitationSearchBrand < ActiveRecord::Base 
    belongs_to :invitation_search 
    belongs_to :brand 
end 

class InvitationSearchCategory < ActiveRecord::Base 
    belongs_to :invitation_search 
    belongs_to :category 
end 

在我invitation_searches_controller創建方法我想創建一個新的InvitationSearch前檢查匹配。

在我的參數中,我得到了性別,brand_ids,category_ids和size_ids,我只關心具有EXACT性別和相同的關聯id集合的記錄,不多不少。

我知道我可以做類似下面的事情,但是這會返回所有包含這些品牌的記錄,而不是確切的集合。另外,我需要對每個協會執行操作,看起來這樣會比較單調乏味。

InvitationSearch.includes(:brands).where(:brands => {:id => params[:invitation_search][:brand_ids]}) 

在此先感謝!

+0

謝謝格式化邁克爾! – Heidi

回答

0

這仍然看起來不好,但它是你想要返回?

InvitationSearch.includes(:brands) 
    .where(:brands => {:id => params[:invitation_search][:brand_ids]}) 
    .select { |i_s| i_s.brands.count == params[:invitation_search][:brand_ids].count } 

第二個嘗試:

q = InvitationSearch.includes(:brands) 
params[:invitation_search][:brand_ids].each do |brand_id| 
    q = q.where(:brand_id => brand_id) 
end 

不過在第二次嘗試,如果你正在使用Ruby 1.9.2+,您可以使用新的語法brad_id: brand_id

+0

是的,或多或少,我只是想知道計數是否足夠。例如,如果我的params [:brand_ids]返回[1,3,5],並且第一個查詢返回包含任何這些id的所有記錄,計數是否有可能返回帶有brand_id的記錄,例如[ 1,2,6]。 – Heidi

+0

已修改。現在怎麼樣?編輯:你知道什麼,也許我現在太累了。 :) –