具有基于相关模型的条件的范围

时间:2016-10-13 21:55:24

标签: sql ruby-on-rails ruby postgresql scope

我正在尝试在我的Rails 4应用程序中编写一个多条件范围。

class Receipt
  # Scope to only get Receipt objects that need to be sent out.
  def self.needs_send_receipts
    where(sent_receipt: false) && company.employees.size > 0 && company.teams.first.action_items.size >= 15
  end
end

这不起作用,我想弄清楚为什么,如果它评估为真并返回信息。

1 个答案:

答案 0 :(得分:0)

以下是我提出的问题(警告:大量使用scope):

  1. 将范围添加到Team模型,该模型选择至少包含15 action_items且限制为1的对象:

    class Team
      # company.teams.first.action_items.size >= 15
      scope :some_action_items, lambda {
        joins(:action_items)
         .group('teams.id')
         .having('COUNT(action_items.id >= 15').limit(1)
      }
    end
    
  2. Company模型添加范围,选择至少有一个关联employee的对象:

    class Company
      # company.employees.size > 0
      scope :with_employees, -> { joins(:employees) }
    end
    
  3. 最后,在Receipt模型中使用这些范围,通过merge范围考虑所有上述条件来查询receipts

    class Receipt
      # where(sent_receipt: false)
      scope :receipt_not_sent, -> { where(sent_receipt: false) }
    
      # Scope to only get Receipt objects that need to be sent out
      scope :needs_send_receipts, lambda {
        receipt_not_sent
          .joins(company: [:employees, teams: :action_items])
          .merge(Company.with_employees)
          .merge(Team.some_action_items)
      }
    end
    
  4. 我希望您意识到我甚至没有机会测试它,所以如果出现任何错别字/错误/等等,请不要发表评论

      

    我的错误是you have mistyped a single letter您的解决方案   没有工作atata

    但只是尝试按照这个想法,你会弄清楚:)