这是我在 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 的新手,我知道必须有更好的方法来执行此查询。任何帮助将不胜感激。
谢谢!