如何基于多个关联模型查询模型

时间:2016-09-02 12:43:52

标签: mysql ruby-on-rails activerecord model associations

我有一个rails应用程序,我有以下模型 -

城市,酒店,餐厅,公园。

协会就是这样 -

class City < ActiveRecord::Base

 has_many :hotels
 has_many :restaurants
 has_many :parks

end

我想找到所有至少有一家酒店或餐厅或公园的城市。

如何编写单个查询来获取此类城市?

3 个答案:

答案 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方法。另外,如果关联表中有一些数据,请不要忘记重置缓存计数器。