Ruby on Rails查询无法正常工作

时间:2015-10-31 01:46:31

标签: ruby-on-rails activerecord

我有几个列表,我定义了一些过滤器。特别是列表has_many :spaces, through: :designationshas_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

1 个答案:

答案 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