2014-09-19 2 views
0

에 테이블을 가입 나는 다음과 같은 구조를 가지고 :전달하는 방법을 데이터가 생성

class User < ActiveRecord::Base 
    has_many :device_ownerships 
    has_many :devices, :through => :device_ownerships 
end 

class Device < ActiveRecord::Base 
    has_one :device_ownership 
    has_one :user, :through => :device_ownership 
end 


class DeviceOwnership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :device 
end 

그러나 DeviceOwnership 또한 일련의 _ 행

내가 작성에 DeviceOwnership하는 일련의 _ 값을 전달하려는

있습니다. 나는 내가 할 수있는 것을 이해한다

def create 
    user = User.create 
    device = Device.create 
    device_ownership = DeviceOwnership.create(:serial_numer => params[:device_serial_number], :device_id => device.id, :user_id => user.id) 
end 

이것은 더 좋은 해결책이 아닌가?

답변

3

를 사용하여 중첩 된 속성 : 이제

class User < ActiveRecord::Base 

    has_many :device_ownerships 
    has_many :devices, :through => :device_ownerships 
    accepts_nested_attributes_for :devices 
end 

class Device < ActiveRecord::Base 
    has_one :device_ownership 
    has_one :user, :through => :device_ownership 
    accepts_nested_attributes_for :device_ownership 

    def device_ownership_attributes=(attributes) 
    dev = build_device_ownership(attributes) 
    dev.user = self.user 
    end 
end 


class DeviceOwnership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :device 
end 

당신의 PARAMS이 같은 경우는 트랜잭션에서 한 번에 모든 연결을 저장할 수 있습니다

pramas = {"user"=>{ "email"=>"[email protected]", "devices_attributes" =>{"0"=>{"name" => "Devise 1", "device_ownership_attributes"=>{"device_serial_number"=>"xyz"}}}} 
user = User.create(params['user']) 
# will save User, devise, and devise ownership all at once. 
+0

멋진, 나는 몰랐어요 .. 감사합니다 하나의 값으로 만 생성시 DeviceOwnership을 생성하면 Rails는 device.id를 자동으로 할당합니다. – Stpn

+0

MySQL 트랜잭션에서 모든 것이 실행됩니다. 즉, 일부 유효성 검사가 실패하면 아무 것도 저장되지 않고 모든 COMMITS가 되돌아갑니다. – Surya

관련 문제