2015-10-24 91 views
2

錯協會我試圖建立用戶和項目之間的關聯基礎:導軌和的has_many

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 

my project_me mbers表:

+----+------------+---------+ 
| 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是會員?

回答

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 
+0

謝謝,你的解決方案很好;) – Evolutio

3

作爲的補充的回答,您也不妨看看has_and_belongs_to_many

enter image description here

主要的原因你會因爲你不使用你的加入模型中的任何額外的屬性使用這個(這是您當前的建立)。

如果你想保持這種方式,您可以與您的加盟模式,通過使用代替has_many :throughhas_and_belongs_to_many協會做掉:

#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關係。如果您不需要對關係模型執行任何操作,則可能會更簡單地設置關係(儘管您需要記住 以在數據庫中創建連接表)。


問候你原來的問題,你必須也記得,爲了從一個關聯模型取回數據,你必須建立一個將與數據填充的關聯。

你提到...

爲什麼我得到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的答案。

+1

這是一個非常好的答案。良好的工作:-) 但選擇與「has_and_belongs_to_many」去時要小心。這是一個關於它的警告: http://blog.flatironschool.com/why-you-dont-need-has-and-belongs-to-many/ – kaspernj

+0

謝謝了。我在最簡單的關聯上使用habtm,在您的應用中使用像「post_category.rb」和「image_category.rb」這樣的廢話模型。沒有什麼比看別人的模型更容易看到20的時候,他們很容易就有5 –