2014-01-30 11 views
1

我試圖通過軌道中的關聯模型來獲取用戶的當前公司角色。Rails建模has_one被另一個foreign_key過濾

用戶可以擁有許多公司,並在每個公司中擁有不同的地位。

如何進行建模,所以我可以做這樣的事情User.first.current_company.status

我已經擁有了用戶和公司表。

換句話說:

甲的has_many燒烤

甲的has_many銫

通過C A HAS_ONE乙

(有許多作爲至C這HAS_ONE B)

如何定義這個關聯?

回答

0

最終我創建了屬於所有不同實體(A,B,C)的連接表。

A也能經由HAS_MANY B中加入表 B可HAS_MANY C到該連接表 C能HAS_MANY一個通過連接表

是連接表的A,B和C的has_many

要獲得一個B或A的C,我創建了一個方法來檢索與A 的連接表中的記錄,然後使用該記錄返回B或C.

0

在你User.rb型號:

class User < ActiveRecord::Base 
    has_many :companies 
end 

在你Company.rb型號:

class Company < ActiveRecord::Base 
    belongs_to :user 
end 

我假設狀態是在你的公司表中的屬性。有了這個設置,你應該可以執行你想要的命令。

+0

怎能狀態是對公司表,如果該公司有很多不同狀態的用戶! – bcm

1

考慮下面的模型架構:

# app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :companies 
end 

# app/models/company.rb 
class Company < ActiveRecord::Base 
    belongs_to :user 
    has_one :status 
end 

# app/models/status.rb 
class Status < ActiveRecord::Base 
    belongs_to :company 
end 

下面的關係是有效的:

status = Status.first 
company = Company.first 
user = User.first 

company.status = status # Assign status to company 

user.companies << company # Add company to user 

user.companies.last.status == Status.first # Status of user's last company is the original status 
#=> true 
+0

這是假設狀態需要有company_id。如果狀態只需要沒有公司數據的狀態(ID,狀態),並且有一個連接表將一起加入用戶,公司和狀態......這種設計理想或者您的解決方案會更好嗎? – bcm

+0

考慮到你在'A','B'和'C'之間的問題中描述的關係,我不確定你能否有效地模擬這些關聯,而無需爲公司分配狀態。它可能是可能的,但我所提出的幾乎肯定會提供你正在尋找的行爲。 – zeantsoi

+0

你將如何在1家公司存儲不同用戶的狀態?看起來公司中的狀態總是會被不同的用戶覆蓋。 (當然不是我的行爲) – bcm

0

我會用Rolify Gem做到這一點。

class User < ActiveRecord::Base 
    rolify 
    has_and_belongs_to_many :companies 

    def status(company) 
     roles = [:manager, :supervisor, :line-level] 
     status = [] 
     roles.each { |role| status << role if self.has_role? role, company } 
     return status 
    end 
end 

class Company < ActiveRecord::Base 
    resourcify 
    has_and_belongs_to_many :users 
end 

這將允許你這樣做......

@company = @user.companies.first 
@user.status @company  #=> [:manager] An array assuming they can have many roles. 

使用這個寶石可以讓你把一個對象上的多個角色和作用範圍包括該對象。

+0

我需要一種可以與幾種不同的A-B-C方案一起工作的關聯模式,而不僅僅是狀態或角色。這看起來像它專門爲角色構建的... – bcm

+0

什麼是將被建模的一些示例狀態? – rafroehlich2

+0

每個用戶有不同的公司啓用或禁用。每家公司都有不同的用戶啓用或禁用。 – bcm