【问题标题】:Rails, why joins returns array with non-uniq values?Rails,为什么连接返回具有非唯一值的数组?
【发布时间】:2011-03-11 15:11:10
【问题描述】:

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

假设,我有一个模型 City,它有很多 Locations。我试图找到有位置的城市。

我使用以下代码:

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. 为此目的,首选使用什么来代替连接?

【问题讨论】:

    标签: ruby-on-rails unique join


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢! 是我需要的!但是为什么 rails 不想自己分组呢?输出 rails 对象是没有任何位置的城市数组。恕我直言,这种输出没有用例。
    • 感谢您的帮助。一个问题 - 如果不需要 select 语句,City.x 不会自然地带回城市吗?
    • @edebill 有没有办法在每个查询中省略这个group('cities.id')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多