Rails 4.1范围方法与关系

时间:2015-01-30 07:41:05

标签: ruby-on-rails

我正在使用Rails 4.1并试图设置一个看似简单的范围方法,但我似乎无法理解。

高级数据模型是:

class Request < ActiveRecord::Base
  has_many :items, dependent: :destroy
  has_many :actions, through: :items
end

class Item < ActiveRecord::Base
  belongs_to :request
  belongs_to :action
end

class Action < ActiveRecord::Base
  enum usertype: { isnormal: 0, isadmin: 1 }
end

对于我们的应用,Request如果其相关操作“usertype设置为isadmin,则表示为管理请求。

我正在尝试设置范围方法(或类似的方法),我们可以通过Request.admin的某些内容检索管理请求,并通过Request.normal检索正常请求。

我似乎无法绕过如何将任何东西连在一起来检索它们。

2 个答案:

答案 0 :(得分:1)

class Request < ActiveRecord::Base
  has_many :items, dependent: :destroy
  has_many :actions, through: :items

  scope :with_usertype, -> (type) { joins(:actions).where(actions: {usertype: Action.usertypes[type]}) }
  scope :admin,         -> { with_usertype(:isadmin) }
  scope :normal,        -> { with_usertype(:isnormal) }
end

答案 1 :(得分:1)

我终于能够找到解决问题的方法了。我不知道这是最好的方法,但它很有效,看起来很简单直接。 (而且我不知道为什么花了这么长时间才得到它。)

class Request < ActiveRecord::Base
  has_many :items, dependent: :destroy
  has_many :actions, through: :items
  scope :isadmin, -> { joins(:actions).where(actions: {usertype: Action.usertypes[:isadmin]}) }
  scope :isnormal, -> { where.not(id: isadmin.pluck(:id)) }
end