使用选择组合ActiveRecord范围

时间:2018-04-25 15:42:28

标签: activerecord arel

不幸的是,ActiveRecord select替换现有的SELECT子句而不是添加它,因此我无法撰写查询。有没有人有解决方法?

示例模型:

class Story
  scope :recent, -> { where("created_at >= ?", 1.month.ago) }

  # deliberately simple examples, please don't get distracted memoizing, etc.
  scope :with_net_score, -> { select("`stories`.*, (upvotes - downvotes) as net_score" }
  scope :with_recent, -> { select("`stories.*, greatest(updated_at, last_vote_at) as recent") }
end

因此,虽然我可以撰写Story.recent.with_net_score,但Story.with_net_score.with_recent会失败。在加入关联后with_net_score出现时, <{em> with_recentStory都会失败。

您如何重写with_net_score以便它添加到所选字段而不是重新排列它们,并且可以用with_recent组合并加入?

1 个答案:

答案 0 :(得分:0)

为此添加作者自己的解决方案:

class ApplicationRecord < ActiveRecord::Base
  scope :select_fix, -> { select(self.arel_table.project(Arel.star)) }
end

https://github.com/lobsters/lobsters/blob/master/app/models/application_record.rb