【问题标题】:ActiveRecord distinct doesn't workActiveRecord distinct 不起作用
【发布时间】:2016-03-22 13:49:25
【问题描述】:

我使用带有大量联接的 Active Record 进行了选择。这导致重复值。 select 函数之后是 distinct 函数,其值为 :id。但这没有用!

代码如下:

def join_query
  <<-SQL
    LEFT JOIN orders on orders.purchase_id = purchases.id
    LEFT JOIN products on products.id = orders.complete_product_id
  SQL
end

def select_query
  <<-SQL
    purchases.*,
    products.reference_code as products_reference_code
  SQL
end

result = Purchase.joins(join_query)
                 .select(select_query)
                 .distinct(:id)

当然,distinct!uniq 函数都不起作用。 distinct! 从“ActiveRecord::ImmutableRelation”返回了一个我不知道是什么意思的错误。

为了解决这个问题,我做了一个修改,将 ActiveRecord_Relation 对象转换为一个数组,并使用了 Ruby 的 uniq 函数。

这是怎么回事?

【问题讨论】:

  • ImmutableRelation 表示 ActiveRecord has already fetched the query。试着把你的joins 放在最后。
  • 您使用的是什么关系型数据库?如果您不使用 .distinct(:id) 会看到什么?我怀疑使用.distinct(:id) 是问题所在,因为它正在尝试选择已获取的记录。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

试试这个:

def select_query
  <<-SQL
    DISTINCT ON (purchases.id) purchases.id,
    products.reference_code as products_reference_code
  SQL
end

add more comma separated column names in select clause

Purchase.select(select_query).joins(join_query)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2017-04-12
    相关资源
    最近更新 更多