Rails,为什么连接返回具有非唯一值的数组?

时间:2010-07-04 13:50:57

标签: ruby-on-rails unique join

我使用Rails 3的示例,但我相信Rails 2.3也是如此。

假设我有模型城市有很多地点。我试图找到有位置的城市。

我使用以下代码:

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">]

数组长度为4(莫斯科的位置数)。

在什么情况下它可能有用?目标是输出数组中一个对象的4个副本?

我可以使用City.joins(:locations).uniq,但我失去了对arel的敏捷。

我有两个问题:

  1. 为什么连接会返回非唯一数组?
  2. 为此目的,更喜欢使用什么而不是连接?

1 个答案:

答案 0 :(得分:16)

Join实际上是说组合两个表并将其视为一个表,然后发送回发现的内容。这意味着它将为您找到城市和位置的每个组合(Rails通过根据模型中的belongs_to / has_many关系进行匹配来帮助您。)

执行City.joins(:locations)将用于查找城市中的所有位置。另一种方式(Location.joins(:city))用于查找位置所在的城市。

现在,要找到包含某些位置的城市列表,您可以尝试City.select(:city).joins(:locations).group('cities.id') select()子句告诉它只需将城市带回来,而group()子句告诉它不要带回副本。