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的集合。
是的,但我想只为某个用户的水权获取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
我最终使用了这个查询:'PlaceOfUseArea.joins(:water_rights).where(water_rights:{user_id:user.id})。group('place_of_use_areas.id')'这让我得到了我所需要的东西。感谢您指点我正确的方向! – wheatbox 2014-12-09 10:16:02
不客气!还有一个关于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