1

新しいレコードを作成する前に、まったく同じ関連付けを持つ既存の 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 を取得します。私は、正確な性別と同じ関連付け ID のセットを持つレコードのみを気にします。

次のようなことができることはわかっていますが、正確なセットではなく、これらのブランドのいずれかを含むすべてのレコードが返されます。さらに、関連付けごとに操作を実行する必要があり、かなり面倒に思えます。

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

前もって感謝します!

4

1 に答える 1

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 }

2 回目の試行:

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

2 回目の試行では、ruby 1.9.2 以降を使用している場合は、新しい構文を使用できますbrad_id: brand_id

于 2012-06-09T00:57:13.257 に答える