Rails范围或基于相关表字段的def

时间:2015-02-19 15:37:42

标签: ruby-on-rails

我有一个Rails 3应用程序,其中包含一个名为worequests的表。

worequest.rb模型包含:

  belongs_to :statuscode

Statuscodes有一个名为closed的布尔字段。

我希望能够获得worequests所有worequest.statuscode.closed == true的列表。

例如:

def index2
  @search = Worequest.closed.search(params[:q])
  @worequests = @search.result
end

OR

worequests.notclosed.count

我在worequest模型中尝试了这些:

scope :closed, joins(:statuscode).where(:statuscode.closed => true)
scope :closed, joins(:statuscode).& Statuscode.closed
scope :closed, joins(:statuscode) & Statuscode.closed

def self.closed
  joins(:statuscode) & Statuscode.closed
end

def self.notclosed
  joins(:statuscode) & Statuscode.notclosed
end

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

从Rails 4开始,命名范围必须是可调用的,例如lambda:

scope :closed, -> { joins(:statuscode).where(statuscodes: { closed: true }) }

应该做的伎俩(请注意:statuscode中的单数joinstatuscodes条件中的复数where表名。

答案 1 :(得分:0)

我不确定我是否正确理解了这个问题。 您是否只想在课堂上使用示波器,以便全部关闭?

class StatusCode < ActiveRecord:Base
  belongs_to :worequest
end

class Worequest < ActiveRecord:Base
  has_one :status_code do
    def closed
      where(closed: true)
    end
  end
end

closed_quests: Worequest.all.closed

我的答案基于这里提出的问题:How do you scope ActiveRecord associations in Rails 3?

这就是我解释你的问题的方式。 对于rails 4,我建议使用另一个答案。