我有一个rails应用程序,我有以下模型 -
城市,酒店,餐厅,公园。
协会就是这样 -
class City < ActiveRecord::Base
has_many :hotels
has_many :restaurants
has_many :parks
end
我想找到所有至少有一家酒店或餐厅或公园的城市。
如何编写单个查询来获取此类城市?
答案 0 :(得分:0)
对于Rails 5,您可以使用如下
cities = City.includes(:hotels, :restaurants, :parks)
cities = ((cities.where.not(hotels: {id: nil})).or(cities.where.not(restaurants: {id: nil})).or(cities.where.not(parks: {id: nil})))
对于较低版本的rails,您需要使用arel_table
答案 1 :(得分:0)
City模型没有关于相关内容的任何信息。 您需要从hotel / park / etc中选择数据。
使用AR的includes
查找具有指定关系的所有城市。
City.includes(:hotels, :restaurants, :parks)
答案 2 :(得分:0)
最合适的解决方案是使用counter cache
然后你应该可以像
一样查询 City.where('hotels_count > 0 OR restaurants_count > 0 OR parks_count > 0')
P.S。可以通过多种方式重写此查询,例如使用.or
方法。另外,如果关联表中有一些数据,请不要忘记重置缓存计数器。