0

私のアプリには、データベース内のすべてのプロジェクトをレンダリングするページがあります。私が望むのは、たとえば、ユーザーがメンバーになっている 1 回だけを表示するなど、結果をフィルター処理できるようにすることです。

以下は、まさにそれを行いたいプロジェクトコントローラーからのものです(ユーザーがメンバーであるプロジェクトのみを表示します)。まず、user_id が見つかった「ProjectUser」からすべてのプロジェクトを取得します。次に、この配列を使用して、@user_is_member.project_id を使用して、テーブル 'Projects' から関連するすべてのプロジェクトを取得します。

すべてではなく 1 つのプロジェクトしか得られないため、これは機能しません。

コードを変更して、目的を達成するにはどうすればよいですか?

コード:

@user_is_member = ProjectsUser.where(:user_id => current_user.id)

@user_is_member.each do |member|
    @projects = Project.where(:id => member.project_id)
end

テーブル:

プロジェクト_ユーザー:

project_id
user_id

プロジェクト:

id
...non relevant fields...

モデル:

ユーザーモデル:

class User < ActiveRecord::Base
  has_many :project_users
  has_and_belongs_to_many :projects
end

プロジェクト モデル:

class Project < ActiveRecord::Base
  has_and_belongs_to_many :users # => , :class_name => 'User'

  belongs_to :user
end

ProjectUser モデル:

class ProjectsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

注: current_user は、現在ログインしているユーザーです (「id」などのすべてのユーザー フィールドにアクセスできます)。

4

3 に答える 3

4

これは、モデルを関連付ける良い方法ではありません。ユーザーをプロジェクトに関連付け、1 人のユーザーを管理者/作成者に関連付ける場合は、モデルを次のように関連付ける必要があります。

ユーザー

class User < ActiveRecord::Base
 attr_accessible :first_name, :last_name, :email, :password
 has_secure_password

 has_many :projects_users
 has_many :projects, :through => :projects_users
end

計画

class Project < ActiveRecord::Base
 has_many :projects_users
 has_many :users, :through => :projects_users
end

プロジェクトユーザー

class ProjectsUser < ActiveRecord::Base
 attr_accessible :role

 belongs_to :user
 belongs_to :project
end

ProjectsUser モデルに、文字列値 (admin/member) を持つ追加の列/属性を追加しました。これで、 を実行してプロジェクトのメンバーを取得し、 を実行@project.users.where(:role => 'member')して管理できるようになりました@project.users.where(:role => 'admin').first

方法を変更したくない場合は、コントローラーで次のようにします。

@user_is_member = ProjectsUser.where(:user_id => current_user.id)
project_ids = []

@user_is_member.each do |member|
  project_ids << member.project_id
end

@projects = Project.where(:id => project_ids)
于 2013-02-14T13:37:02.070 に答える
0

project_id問題は、何らかの形で削除されたユーザーがいないことです。

likeステートメントをループにproject_id入れnilて、データベースを確認してください。puts

または、リレーションシップで を使用:dependent => :destroyして、このような一貫性のないデータを取り除くことができます。通常、テスト中に何らかの形でレコードを削除しているときに発生しますが、他のテーブルの外部キー関連付け関係を削除するのを忘れています。

これは、次のように実行できます。

@user_is_member = ProjectsUser.where(:user_id => current_user.id)

@user_is_member.each do |member|

puts "Checking the project id existence for each user member"+member.project_id.to_s

end
于 2013-02-14T13:04:57.630 に答える