rails与has_many的关联错误

Evo*_*tio 2 activerecord ruby-on-rails ruby-on-rails-4

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

user.rb

class User < ActiveRecord::Base
  has_many :projects, foreign_key: 'owner_id'
  has_many :project_members, through: :project_members
end
Run Code Online (Sandbox Code Playgroud)

project.rb

class Project < ActiveRecord::Base
  has_many :project_members, dependent: :destroy
  has_many :users, through: :project_members
end
Run Code Online (Sandbox Code Playgroud)

project_member.rb

class ProjectMember < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)

我的project_members表:

+----+------------+---------+
| id | project_id | user_id |
+----+------------+---------+
|  1 |          1 |       1 |
|  2 |          2 |       1 |
+----+------------+---------+
Run Code Online (Sandbox Code Playgroud)

和我的项目表:

+----+-------+----------+
| id | name  | owner_id |
+----+-------+----------+
|  1 | test1 |        1 |
|  2 | test2 |        2 |
+----+-------+----------+
Run Code Online (Sandbox Code Playgroud)

为什么我喜欢

current_user.projects
Run Code Online (Sandbox Code Playgroud)

只有projects.owner_id = current_user.id的项目而不是用户所在的项目?

但我认为这是错误的一面,我试图获得我想要的数据.我在/项目控制器获取数据的项目.我想我应该使用这样的东西:

class ProjectsController < ApplicationController
  # GET /projects
  def index
    @projects = Project.all
  end
end
Run Code Online (Sandbox Code Playgroud)

但我怎么只能得到current_user.id所属的项目?

kas*_*rnj 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
Run Code Online (Sandbox Code Playgroud)

为了获得所有项目,current_user是你可以做的成员:

current_user.projects
Run Code Online (Sandbox Code Playgroud)

为了获得current_user拥有的所有项目,您可以:

current_user.owned_projects
Run Code Online (Sandbox Code Playgroud)