要在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
搜索條目,或創建一個新的。
你需要爲這些實體分別設置一個獨立的模型嗎?他們看起來像是一個具有複合獨特密鑰的單一模型的屬性。 – jmc
我不想denormilize DB。單一模型是唯一的方法嗎? – blackst0ne
標準的等級關係沒有工作嗎?比如Person has_many職位,Postion has_many工作區等等。然後創建一個新人是標準關聯工作:'@person = Person.create(...)','@person.position << Position.new(.. 。'''''person.position.workspace << Workspace.new(...)'等。或者@jmc建議,稍微扁平化(你可能不需要那麼多層)。也許如果你舉了一個你嘗試過的例子,我們可以告訴你有什麼問題。 – lurker