rails与has_many的关联错误

时间:2015-10-24 08:33:21

标签: ruby-on-rails ruby-on-rails-4 activerecord

我尝试在用户和项目之间建立基本关联:

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所属的项目?

2 个答案:

答案 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

enter image description here

您使用此功能的主要原因是您未在连接模型中使用任何额外属性(这是您当前的设置)。

如果您希望保持这种状态,可以使用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的答案中。