【问题标题】:Finding a record with an exact set of has_many :through association ids使用一组精确的 has_many 查找记录:通过关联 ID
【发布时间】:2012-06-09 00:27:34
【问题描述】:

我正在尝试在创建新记录之前检查具有完全相同关联的现有 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 create 方法中,我想在创建新的 InvitationSearch 之前检查匹配项。

在我的参数中,我得到了gender、brand_ids、category_ids 和size_ids,我只关心具有EXACT 性别和同一组关联ID 的记录,不多不少。

我知道我可以执行以下操作,但这会返回包含任何这些品牌的所有记录,而不是确切的集合。另外,我需要对每个关联执行操作,看起来比较繁琐。

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

提前致谢!

【问题讨论】:

  • 感谢 Michael 的格式化!

标签: ruby-on-rails associations


【解决方案1】:

这看起来仍然很糟糕,但它是您想要返回的吗?

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

【讨论】:

  • 是的,或多或少,我只是想知道计数是否足够。例如,如果我的 params[:brand_ids] 返回 [1,3,5] 并且第一个查询返回包含任何这些 id 的所有记录,那么 count 不可能返回带有 brand_ids 的记录,例如 [ 1,2,6].
  • 已编辑。现在怎么样?编辑:你知道吗,也许我现在太累了。 :)
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多