通过关系表获取值

时间:2013-02-14 12:51:57

标签: ruby-on-rails database ruby-on-rails-3 relational-database

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

下面是我的项目控制器,我想要做的就是这样做(仅显示用户所属的项目)。首先从'ProjectUser'获取user_id的所有项目是什么做的。然后我想使用这个数组从'Projects'表中检索所有相关项目,并使用@ 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

表:

projects_users:

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”)

3 个答案:

答案 0 :(得分:4)

这不是关联模型的好方法。如果要将用户与项目关联并将一个用户设置为admin / creator,则应将模型关联为:

用户

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

ProjectsUser

class ProjectsUser < ActiveRecord::Base
 attr_accessible :role

 belongs_to :user
 belongs_to :project
end

我已经为您的ProjectsUser Model添加了一个额外的列/属性,它将具有一个字符串值(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)

答案 1 :(得分: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

答案 2 :(得分: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