Rails 3:通过计算子项来过滤结果

时间:2013-01-11 18:50:57

标签: ruby-on-rails ruby-on-rails-3 postgresql

我正在制定一个批准系统,如果有更多的负面批准而不是正面,则会过滤掉一个示例。

class Set < ActiveRecord::Base
  has_many :examples
end

class Example < ActiveRecord::Base
  has_many :approvals, as: :approvable
end

class Approval < ActiveRecord::Base
  belongs_to :approvable, polymorphic: true
  belongs_to :example
  attr_accessible :choice #boolean
end

我可以通过调用Example.approvals获得属于示例的所有批准。

我想知道的是,如果可以在示例模型上创建一个方法,那么我可以使用la Example.approved,它将返回true或false并使用单个查询取决于如果示例有更多Approvals with true或false。最后,我想通过调用Set.approved_examples来调用已经批准的集合示例。

Example.approved我可以做什么

class Example < ActiveRecord::Base
  ...
  def approved
    if approvals.where(choice: true).count > approvals.where(choice: false).count
      return true
    end
    false
  end
end

虽然这需要两个查询。

Set.approved_examples看起来像here中的SQL View approved_examples,但如果我想在Set模型上使用这样的范围,我不确定从哪里开始。

1 个答案:

答案 0 :(得分:1)

好的,根据你的评论,我认为我误解了你的问题,但也许你可以尝试这样的事情:

Example.all.select { |example| example.approved == true }

这将为您提供一系列经过批准的示例。

Set.first.examples.all.select { |example| example.approved == true } 

这将为您提供属于第一组记录的所有已批准示例的数组。

我认为这可能是一种更优化的方法,但这确实有用。