2013-06-20 79 views
1

我已經無法解決我的問題已經一週了。Ruby on Rails:如何通過關係使用多個模型和has_many?

我有4種型號:位置工作區,並Phonenumber來

層級結構爲人>職位>工作區>電話號碼

所有4款車型都是獨一無二的。 說,有可能只有一個

Person | Position | Workspace | Phonenumber | 
Smith Engineer Department #4 555-666 

但也有可能是另一個人用同樣的位置,工作區和電話號碼:

Person | Position | Workspace  | Phonenumber | 
Johnson Engineer Department #4  555-666 

甚至相同的史密斯先生,但不同的位置或工作空間。

Person | Position | Workspace  | Phonenumber | 
Smith Engineer Department #7  555-666 

依此類推。

所有4個在同一時間是獨一無二的。

我想存儲這些數據。我嘗試了很多不同的東西。沒有任何幫助我達到100%。 現在我的最好的辦法是通過與連接模型稱爲員工關係使用的has_many:

person_id | position_id | workspace_id | phonenumber_id 

但我怎麼處理數據的?

說,我想創建一些位置,工作區和電話號碼的新人。 我該怎麼做?

+0

你需要爲這些實體分別設置一個獨立的模型嗎?他們看起來像是一個具有複合獨特密鑰的單一模型的屬性。 – jmc

+0

我不想denormilize DB。單一模型是唯一的方法嗎? – blackst0ne

+0

標準的等級關係沒有工作嗎?比如Person has_many職位,Postion has_many工作區等等。然後創建一個新人是標準關聯工作:'@person = Person.create(...)','@person.position << Position.new(.. 。'''''person.position.workspace << Workspace.new(...)'等。或者@jmc建議,稍微扁平化(你可能不需要那麼多層)。也許如果你舉了一個你嘗試過的例子,我們可以告訴你有什麼問題。 – lurker

回答

1

要在Rails應用4創建安裝:

rails g model Person last_name 
rails g model Position job_title 
rails g model Workspace name 
rails g model Phonenumber number 
rails g model Employee person_id:integer position_id:integer workspace_id:integer phonenumber_id:integer 

應用程序/模型/ person.rb

class Person < ActiveRecord::Base 
    has_many :employees, :dependent => :destroy 

    has_many :positions, :through => :employees 
    has_many :workspaces, :through => :employees 
    has_many :phonenumbers, :through => :employees 

    validates :last_name, 
      :presence => true 
end 

應用程序/模型/ employee.rb

class Employee < ActiveRecord::Base 
    belongs_to :person 
    belongs_to :position 
    belongs_to :workspace 
    belongs_to :phonenumber 

    validates :person, :position, :workspace, :phonenumber, 
      :presence => true 

    validates :person_id, 
      :presence => true, 
      :uniqueness => { :scope => [ :position_id, :workspace_id, :phonenumber_id ]} 
end 

現在創建一個新的Person的一切:

Person.create(:last_name => 'Smith').employees.where(:position => Position.where(:job_title => 'Engineer').first_or_create, :workspace => Workspace.where(:name => 'Department #8').first_or_create, :phonenumber => Phonenumber.where(:number => '555-666').first_or_create).first_or_create 

要創建其他Position此史密斯:

Person.where(:last_name => 'Smith').last.employees.where(:position => Position.where(:job_title => 'Admin').first_or_create, :workspace => Workspace.where(:name => 'Department #8').first_or_create, :phonenumber => Phonenumber.where(:number => '555-667').first_or_create).first_or_create 

first_or_create搜索條目,或創建一個新的。

+0

非常感謝! 我編輯你的例子有點爲我的情況。它像一個魅力! 我不明白爲什麼我沒有自己得到它?這很明顯。 =) – blackst0ne

相關問題