此问题基于此:Rails, why joins returns array with non-uniq values?
假设我通过.joins()
方法得到非uniq数组:
City.joins(:locations)
# => [#<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">]
我可以使用
创建uniq记录City.joins(:locations).group('cities.id') # or simpler
City.joins(:locations).uniq
# => [#<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">]
如何使.joins()
方法默认返回uniq记录?
答案 0 :(得分:2)
您可以尝试覆盖所需模型的.joins
方法,但我建议只编写一个范围,例如
scope :unique_locations, -> { joins(:locations).uniq }
然后拨打City.unique_locations
。它更清洁,更具可读性。
一般来说,只有当你确定不需要“旧方法”时才应该进行覆盖方法,这是有道理的。另外,当你说City.joins(:locations)
读者期望默认行为,并返回别的东西会导致混乱和混乱。
答案 1 :(得分:1)
您可以使用has_many
lambda作为参数定义stubby
宏:
has_many :locations, -> { joins(:locations).uniq }
您也可以定义自己的AR关系方法,它使用简单的has_many
宏。
has_many :locations do
def only_uniq
joins(:locations).uniq
end
end
现在使用它:
c = City.find(123)
c.locations.only_uniq
它与scope
中的lambda
或has_many
完全相同。