2

这是我在 StackOverflow 上的第一个问题……请温柔一点。我刚刚开始学习 Ruby on Rails,而且我主要是通过我的第一个学习项目,但我似乎无法以一种可以与 will_paginate 一起工作的方式构建这个查询。

我有一个模型结构,其中包括用户、组和计算机。用户组与计算机组之间没有区别。组是一个组,通过两个 has_many 关系包括许多用户和/或计算机。一台计算机和/或用户可以在许多组中。这是我的模型:

class Group < ActiveRecord::Base
  attr_accessible :name
  has_many :user_memberships
  has_many :users, :through => :user_memberships
  has_many :computer_memberships
  has_many :computers, :through => :computer_memberships

  validates :name, presence: true, length: { maximum: 50 }, uniqueness: { case_sensitive: false }
end

class ComputerMembership < ActiveRecord::Base
  attr_accessible :computer_id, :group_id
  belongs_to :computer
  belongs_to :group
  validates_uniqueness_of :computer_id, :scope => :group_id
  validates_presence_of :computer
  validates_presence_of :group
end

class UserMembership < ActiveRecord::Base
  attr_accessible :group_id, :user_id
  belongs_to :user
  belongs_to :group
  validates_uniqueness_of :user_id, :scope => :group_id
  validates_presence_of :user
  validates_presence_of :group
end

用户和组(为简洁起见,仅包括 has_many 部分):

class User < ActiveRecord::Base

  ...

  has_many :user_memberships, dependent: :destroy
  has_many :groups, through: :user_memberships

  ...

end

class Computer < ActiveRecord::Base

  ...

  has_many :computer_memberships, dependent: :destroy
  has_many :groups, through: :computer_memberships

  ...

end

我正在尝试构建一个查询以仅检索 current_user 也是其成员的组中的(不同的)计算机。我在我的控制器中尝试这样的事情:

  def computers_in_users_groups_or_all_if_admin
      unless admin?
        computerarray = Array.new
        current_user.group_ids.each do |id|
          computerarray = computerarray | Group.find(id).computer_ids
        end
        @computers = Computer.find(computerarray).paginate(page: params[:page], per_page: 30).order('sn')
      else
        flash.now[:notice] = "You are seeing all computers because you are an administrator."
        @computers = Computer.paginate(page: params[:page], per_page: 30).order('sn')
      end
    end

它似乎正在工作,但它返回一个不能与 will_paginate 一起使用的数组,除非我明确包含数组支持。will_paginate/array 似乎也不支持 .order 方法。作为 Rails 和 ActiveRecord 的新手,我知道必须有更好的方法来执行此查询。任何帮助将不胜感激。

谢谢!

4

2 回答 2

1

首先,为什么不在分页前排序?

但是,使用 Rails 和 ActiveRecord 解决这个问题的更好、更惯用的方法是命名范围,例如

# computer.rb
class Computer
scope :all_for_user, lambda { |user| user.admin? ? Computer.paginate(page: params[:page], per_page: 30) : user.groups.computers.paginate(page: params[:page], per_page: 30)
end

# computer_controller.rb
Computer.all_for_user(current_user)

您需要确保已设置可靠的关联代码。您可能会想要一个Usertohas_and_belongs_to_many :groups并且has_many :computers, :through => :groups这大大简化了查询和逻辑。

注意 上面的代码完全不在我的脑海中并且未经测试,但它应该为您指明正确的方向。

于 2012-12-30T23:41:53.827 回答
0

使用上面 jxp 的指导,虽然我没有制作范围,因为我只需要在一个地方,我回去重新审视我的模型。我刚刚添加

has_many :computers, through: :groups, :uniq => true

到我的用户模型,然后能够调用:

@computers = current_user.computers.paginate(page: params[:page], per_page: 15).order('sn')

现在工作正常。:D

于 2012-12-31T04:26:15.203 回答