Rails - 如何自动uniq连接方法?

时间:2015-06-29 07:58:40

标签: ruby-on-rails ruby activerecord

此问题基于此: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记录?

2 个答案:

答案 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中的lambdahas_many完全相同。