0

关联集合所以我有这四个类:的Rails:查询来获取与集合

class User < ActiveRecord::Base 
    has_many :water_rights 
end 

class WaterRight < ActiveRecord::Base 
    belongs_to :user 
    has_many :place_of_use_area_water_rights 
    has_many :place_of_use_areas, through: :place_of_use_area_water_rights 
end 

class PlaceOfUseAreaWaterRight < ActiveRecord::Base 
    belongs_to :place_of_use_area 
    belongs_to :water_right 
end 

class PlaceOfUseArea < ActiveRecord::Base 
    has_many :place_of_use_area_water_rights 
    has_many :water_rights, through: :place_of_use_area_water_rights 
end 

,我打电话User.first.water_rights并获得WaterRights的集合。我的问题是如何得到这些WaterRights相关PlaceOfUseAreas的集合而不做这样的事情:

areas = [] 
water_rights.each do |wr| 
    areas << wr.place_of_use_areas 
end 
areas.flatten.uniq{ |a| a.id } 

这工作,但它使每一个WaterRight一个新的查询。我正在寻找一种方法来查询一个相关的PlaceOfUseAreas的集合。

回答

0

您只想在单个查询中获取所有关联的PlaceOfUseAreas对象,对不对?

如果是这样,滑道有它非常单行的解决方案:

PlaceOfUseArea.joins(:water_wights).uniq 

更多about joins method,如果你想了解更多信息。

+0

是的,但我想只为某个用户的水权获取PlaceOfUseAreas。 'PlaceOfUseArea.joins(:water_rights).where(water_rights:{user_id:User.first.id})。uniq'我猜这样的东西会起作用吗?另外,有没有办法在ID列上使用'uniq'?我有一个JSON列,似乎抛出这个错误:'PG :: UndefinedFunction:错误:无法识别类型json'的相等运算符。 – wheatbox 2014-12-08 22:49:13

+0

我最终使用了这个查询:'PlaceOfUseArea.joins(:water_rights).where(water_rights:{user_id:user.id})。group('place_of_use_areas.id')'这让我得到了我所需要的东西。感谢您指点我正确的方向! – wheatbox 2014-12-09 10:16:02

+0

不客气!还有一个关于uniq的小技巧:你可以使用'&block'。例如:'PlaceOfUseArea.joins(:water_wights).uniq {| result | result.id}'。你可以阅读更多[官方文档](http://www.ruby-doc.org/core-2.1.5/Array.html#method-i-uniq) – goodniceweb 2014-12-09 11:20:54