2

これはStackOverflowに関する私の最初の質問です...優しくしてください。私はRubyonRailsを手に取ったばかりで、ほとんど最初の学習プロジェクトを終えていますが、will_paginateでネイティブに機能する方法でこのクエリを構築することはできないようです。

ユーザー、グループ、コンピューターを含むモデル構造があります。ユーザーグループとコンピューターグループの間に違いはありません。グループはグループであり、2つの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)

確実な関連付けコードが設定されていることを確認してください。これにより、クエリとロジックが大幅に簡素化さUserhas_and_belongs_to_many :groupsます。has_many :computers, :through => :groups

注: 上記のコードはすべて私の頭の中で思いついたものであり、テストもされていませんが、正しい方向に向けられるはずです。

于 2012-12-30T23:41:53.827 に答える
0

上記の jxp のガイダンスを使用して、1 つの場所でしか必要ないためスコープを作成しませんでしたが、戻ってモデルを再検討しました。ちょうど追加しました

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 に答える