0

在我的应用程序中,我有一个页面可以呈现数据库中的所有项目。我想要的是能够过滤结果,例如只显示用户是成员的一次。

以下来自我的项目控制器,我想在其中执行此操作(仅显示用户是成员的项目)。首先从找到 user_id 的“ProjectUser”中获取所有项目。然后我想使用这个数组从表“项目”中检索所有相关项目,并使用@user_is_member.project_id。

这不起作用,因为它只给了我一个项目,而不是全部。

如何更改代码以完成我想要的?

编码:

@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

项目用户模型:

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

注意: current_user 是当前登录的用户(可以访问所有用户字段,例如“id”)

4

3 回答 3

4

这不是关联模型的好方法。如果您想将用户关联到项目并使一个用户成为管理员/创建者,那么您应该将您的模型关联为:

用户

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 模型添加了一个额外的列/属性,该模型将具有一个字符串值(管理员/成员)。现在你可以通过做@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 回答
2

如果你想要所有的项目current_user,你可以这样做:

  @projects = current_user.projects

我假设你有类似的东西:

class User < ActiveRecord::Base
  has_many :project_users
  has_many :projects, :through => :project_users
end

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

class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through => :project_users
end
于 2013-02-14T13:03:07.350 回答
0

问题是您没有project_id某些以某种方式被删除的用户。

通过将类似语句放入循环中project_id来检查您的数据库。nilputs

或者,您可以使用: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 回答