使用精确的has_many集合查找记录:通过关联ID

时间:2012-06-09 00:27:35

标签: ruby-on-rails associations

我正在尝试检查现有的InvitationSearch记录是否在创建新记录之前具有完全相同的关联(以避免有2条记录相同)但我无法弄清楚如何执行此操作。

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之前检查匹配。

在我的参数中,我得到了gender,brand_ids,category_ids和size_ids,我只关心具有完全性别和相同的关联ID的记录,不多也不少。

我知道我可以执行以下操作,但这会返回包含任何这些品牌的所有记录,而不是确切的设置。另外,我需要对每个关联执行操作,看起来这样会很乏味。

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

提前致谢!

1 个答案:

答案 0 :(得分: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