ActiveRecord Sum Max连接导致具有多个nil id的数组

时间:2015-02-23 20:41:24

标签: ruby-on-rails join activerecord sum

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的数组?

由于

1 个答案:

答案 0 :(得分:0)

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

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

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

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: <attribute>。其中<attribute>是您要求的属性。 id方法不会引发ActiveRecord::MissingAttributeError,因此在使用关联时要小心,因为它们需要id方法才能正常运行。

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