我有几个列表,我定义了一些过滤器。特别是列表has_many :spaces, through: :designations
和has_many :amenities, through: :offerings
。
我使用过滤器来限制显示的商家信息。
两个主要的是:
# filter by space type
if params[:search][:space_ids].present? && params[:search][:space_ids].reject(&:blank?).size > 0
@listings = @listings.joins(:spaces).where('space_id IN (?)', params[:search][:space_ids].reject(&:blank?)).uniq
end
# filter by amenities
if params[:search][:amenity_ids].present? && params[:search][:amenity_ids].reject(&:blank?).size > 0
@listings = @listings.joins(:amenities).where(amenities: { id: params[:search][:amenity_ids].reject(&:blank?) }).group('listings.id').having('count(*) = ?', params[:search][:amenity_ids].reject(&:blank?).size)
end
第一个过滤器说:获取与所选空间类型匹配的所有列表。
第二个过滤器显示:获取包含所有选定设施的所有商家信息。
这些过滤器在很大程度上起作用,但并非总是如此。特别是,假设列表A具有空间类型1和2以及舒适度2.如果我过滤空间类型1和2(所以space_ids: ['1', '2', '']
)和舒适度2(所以amenity_ids: ['2', '']
),我得到:{ {1}}。
但我应该列出A.查询有什么问题?
基本上,我正在努力实现这一点:Complex Rails query using ActiveRecord on Many to Many relationship
或者:http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough-part-2
答案 0 :(得分:0)
将having('count(*) = ?', params[:search][:amenity_ids].reject(&:blank?).size)
更改为having('count(*) >= ?', params[:search][:amenity_ids].reject(&:blank?).size)
(即=
改为>=
)可解决此问题。
但现在还有另一个问题:Ruby on Rails query yielding unexpected results。