【问题标题】:in Rails, need to set many-to-many relationship and one-to-many relationships between the same two models在Rails中,需要在相同的两个模型之间设置多对多关系和一对多关系
【发布时间】:2013-03-17 10:09:50
【问题描述】:

我有一个应用程序,其中项目属于一个所有者(用户),并且拥有并属于许多成员(用户)。

我在模型中设置了以下代码来处理这些关联。注意,项目在其数据库中有 owner_id 但没有 member_id

项目模型代码

attr_accessible :description, :name, :owner_id, :avatar_url

belongs_to :owner, foreign_key: :owner_id, class_name: "User"
has_and_belongs_to_many :members, class_name: "User"

用户型号代码

has_and_belongs_to_many :projects
has_many :owned_projects, class_name: "Project", foreign_key: "owner_id"
has_many :associated_projects, class_name: "Project", foreign_key: "member_id"

在给定的项目中,我可以调用 p.owner 但不能调用 p.members。对于用户,我可以调用 u.owned_projects 或 u.projects 但不能调用 u.associated_projects。

当我尝试这些命令时,我收到以下错误

1.9.3p194 :003 > p.members
User Load (0.2ms)  SELECT "users".* FROM "users" INNER JOIN "projects_users" ON "users"."id" = "projects_users"."user_id" WHERE "projects_users"."project_id" = 3
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: projects_users: SELECT "users".* FROM "users" INNER JOIN "projects_users" ON "users"."id" = "projects_users"."user_id" WHERE "projects_users"."project_id" = 3

1.9.3p194 :007 > ryan.associated_projects
Project Load (0.2ms)  SELECT "projects".* FROM "projects" WHERE "projects"."member_id" = 14593
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: projects.member_id: SELECT "projects".* FROM "projects"  WHERE "projects"."member_id" = 14593

如何设置这些模型,以便它们按我的意愿工作?

注意:我在 - Two has_many links between the same models 之后建模了我的代码,但它没有帮助。

【问题讨论】:

  • 您的数据库中是否有一个中间表来组合成员和项目?
  • 我不知道,应该吗?如果是,怎么做?
  • 您必须以某种方式存储 ID。检查答案

标签: ruby-on-rails activerecord


【解决方案1】:

你必须在你的用户和项目模型中有一个 has_many_and_belongs_to 关系。您还需要一个中间表。 http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

Class Project < ActiveRecord::Base

     attr_accessible :description, :name, :owner_id, :avatar_url

     belongs_to :owner, foreign_key: :owner_id, class_name: "User"
     has_and_belongs_to_many :members, class_name: "User"

end

Class User < ActiveRecord::Base

     has_and_belongs_to_many :projects
     has_many :owned_projects, class_name: "Project", foreign_key: "owner_id"

end

如前所述,您必须在成员项目和用户(成员)之间有一个中间表。 当您尝试查看项目成员时遇到了该错误:no such table: projects_users

Projects_Users Table
user_id | project_id

【讨论】:

  • 这个表是新模型还是我可以写一个迁移来创建表?
  • 只写一个迁移并运行它,不需要模型
  • 其实好像project_users表的内容应该是user_id和project_id。但是通过该编辑,它可以工作。感谢您的帮助。
  • 哦,对不起,一个愚蠢的错误,当然它不需要同时引用用户和会员ID。很高兴我能帮忙:)
  • 埃里克,belongs_to :associated_projects, class_name: "Project", foreign_key: :member_id 不太对。它会说一个用户属于一个项目。这不对吧? ..gah 我不想拒绝你的编辑,但我不小心跳过了它,它被拒绝了。无论如何,这个解决方案有什么问题?
猜你喜欢
  • 2017-06-10
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 2013-01-18
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多