5

我是 ROR 的新手,我正在尝试了解范围。在我当前的实现中,我正在获取所有处理器并将其显示在视图中。

class ProcessorsController
  def index
    @processors = Processor.all    
  end
end

我想修改它,以便我只能获取用户为 admin 的处理器。我的关系就是这样建立起来的。

class Processor
  belongs_to :feed

  #SCOPES (what I have done so far)
  scope :feed, joins(:feed)
  scope :groups, joins(:feed => :groups).join(:user).where(:admin => true)
end

class Feed < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :groups
  scope :admin,     where(:admin     => true)
end

我能够在我的撬动中做到这一点

pry(main)> Processor.find(63).feed.groups.first.user.admin?

PS:有人可以提供一些很好的资源,如果关系很复杂,我可以学习如何使用范围。

4

2 回答 2

9
scope :with_admin, -> { joins(:feed => { :groups => :user }).where('users.admin' => true) }

至于资源,你看过 ActiveRecord joins 的官方文档吗?

于 2013-10-23T23:09:24.433 回答
0

您不需要范围...您只能使用关系和条件获取用户是管理员的处理器:

class Feed < ActiveRecord::Base
   ...
   has_one :user, through: :groups
end


class Processor
  ...
  has_one :admin, through: :feed, source: :user, conditions: ['users.admin = 1']
end
于 2013-10-23T22:59:11.520 回答