在我的应用程序中,我有一个页面,用于呈现数据库中的所有项目。我想要的是能够过滤结果,例如只显示用户所属的一次。
下面是我的项目控制器,我想要做的就是这样做(仅显示用户所属的项目)。首先从'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”)
答案 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
个类似的语句,检查您的数据库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