我尝试在用户和项目之间建立基本关联:
user.rb
class User < ActiveRecord::Base
has_many :projects, foreign_key: 'owner_id'
has_many :project_members, through: :project_members
end
project.rb
class Project < ActiveRecord::Base
has_many :project_members, dependent: :destroy
has_many :users, through: :project_members
end
project_member.rb
class ProjectMember < ActiveRecord::Base
belongs_to :user
belongs_to :project
end
我的project_members表:
+----+------------+---------+
| id | project_id | user_id |
+----+------------+---------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
+----+------------+---------+
和我的项目表:
+----+-------+----------+
| id | name | owner_id |
+----+-------+----------+
| 1 | test1 | 1 |
| 2 | test2 | 2 |
+----+-------+----------+
我为什么选择
current_user.projects
只有projects.owner_id = current_user.id的项目而不是用户所在的项目?
但我认为我试图获取我想要的数据是错误的。 我在/项目控制器获取数据的项目上。 我想我应该使用类似的东西:
class ProjectsController < ApplicationController
# GET /projects
def index
@projects = Project.all
end
end
但我怎么只能获得current_user.id所属的项目?
答案 0 :(得分:5)
我认为你应该把它设置得有点不同:
class User < ActiveRecord::Base
has_many :owned_projects, class_name: "Project", foreign_key: 'owner_id', dependent: :restrict_with_error
has_many :project_members, dependent: :destroy
has_many :projects, through: :project_members
end
class Project < ActiveRecord::Base
has_many :project_members, dependent: :destroy
has_many :users, through: :project_members
belongs_to :owner, class_name: "User"
end
为了获得所有项目,current_user是你可以做的成员:
current_user.projects
为了获得current_user拥有的所有项目,你可以这样做:
current_user.owned_projects
答案 1 :(得分:3)
作为Kasper Johansen
答案的补充,您可能还希望了解has_and_belongs_to_many
:
您使用此功能的主要原因是您未在连接模型中使用任何额外属性(这是您当前的设置)。
如果您希望保持这种状态,可以使用has_and_belongs_to_many
关联代替has_many :through
取消联接模型:
#app/models/user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :projects
end
#join table - projects_users
#app/models/project.rb
class Project < ActiveRecord::Base
has_and_belongs_to_many :users
end
来自docs:
最简单的经验法则是,如果您需要使用关系模型,则应设置
has_many :through
关系 作为一个独立的实体。如果你不需要做任何事情 关系模型,设置一个可能更简单has_and_belongs_to_many
关系(虽然您需要记住 在数据库中创建连接表。)
关于您的原始问题,您还必须记住,为了从关联模型中获取数据,您必须设置将使用该数据填充的关联。
你提到......
为什么我只使用
的项目current_user.projects
projects.owner_id = current_user.id
...因为您已设置has_many :projects, foreign_key: 'owner_id'
的关联
Rails并不神奇 - 它必须采用你给它的关联并相应地填充这些方法中的数据:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :owned_projects, class_name: "Project", foreign_key: :owner_id
has_and_belongs_to_many :projects
end
#app/models/project.rb
class Project < ActiveRecord::Base
has_and_belongs_to_many :users
end
希望能为您提供更多背景信息,以便添加到Kasper
的答案中。