【问题标题】:ActiveRecord Sum Max Joins results in array with multiple nil idsActiveRecord Sum Max Joins 导致具有多个 nil id 的数组
【发布时间】:2015-02-23 20:41:23
【问题描述】:

Rails activerecord : sum, max and joins相同的问题

除了得到奇怪的结果。

class CustomResumeline < ActiveRecord::Base
  has_many :resumeline_words
end

class ResumelineWord < ActiveRecord::Base
  belongs_to :custom_resumeline
end

CustomResumeline.joins(:resumeline_words).where(resumeline_words: {name: ["time", "data"]}).select('sum(resumeline_words.weight) as nb_votes').group('resumeline_words.custom_resumeline_id').order('nb_votes ASC')

结果

CustomResumeline Load (0.8ms)  SELECT sum(resumeline_words.weight) as nb_votes FROM "custom_resumelines" INNER JOIN "resumeline_words" ON "resumeline_words"."custom_resumeline_id" = "custom_resumelines"."id" WHERE "resumeline_words"."name" IN ('time', 'data') GROUP BY resumeline_words.custom_resumeline_id  ORDER BY nb_votes ASC
 => #<ActiveRecord::Relation [#<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, #<CustomResumeline id: nil>, ...]> 

我的问题是,为什么我会得到一个包含一堆 nil id CustomResumelines 的数组?

谢谢

【问题讨论】:

  • joins 更改为includes

标签: ruby-on-rails join activerecord sum


【解决方案1】:

根据您的查询,您正在使用#select

result =  CustomResumeline.joins(:resumeline_words)...

result 返回一个 relation 对象,其中 id 将由 Rails 添加,就像您使用 #select 一样,尽管您尚未选择它。你现在可以做

result. map { |rec| rec.nb_votes }
# will give array of `nb_votes` values.

来自Selecting Specific Fields指南的一些提示:

Client.select("viewable_by, locked") - 仅选择 viewable_by 和锁定的列。请小心,因为这也意味着您正在初始化一个模型对象,其中仅包含您选择的字段。如果您尝试访问不在初始化记录中的字段,您将收到:ActiveModel::MissingAttributeError: missing attribute: &lt;attribute&gt;。其中&lt;attribute&gt; 是您要求的属性。 id 方法不会引发 ActiveRecord::MissingAttributeError,所以在使用 associations 时要小心,因为它们需要 id 方法才能正常工作。

所以id 方法不会引发ActiveRecord::MissingAttributeError,.. -- 为什么?作为#select,默认情况下将其添加到它创建的每个模型对象中,其值为id 作为nil

【讨论】:

  • 成功了。谢谢!这对我有用。不过,我想知道,如果我使用不同的分组元素,例如名为 resumeline_id 的东西,我能否得到类似于 [resumeline_id = > custom_resumeline_id],... 的结果,顺序仍由 nb_votes 确定
  • 对不起,我终于明白了。再次感谢。映射创建一个数组。我一直在寻找可以自然构建散列的东西。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2012-04-01
  • 2018-01-07
  • 1970-01-01
相关资源
最近更新 更多