2010-08-17 38 views
8

Tôi có mối quan hệ mô hình con và cha mẹ. Trong migration.rb của trẻ, mỗi cột của mô hình con có các giá trị mặc định (ngoại trừ cột parent_id).Ruby on Rails: Tạo một đứa trẻ với các giá trị mặc định khi cha mẹ của nó được tạo

Khi tôi tạo đối tượng cha mẹ mới, làm cách nào để tạo đối tượng con để tạo đối tượng con và lưu vào bảng của nó với dữ liệu từ giá trị mặc định cùng với parent_id?

Tôi nghĩ rằng nó sẽ phải làm với một cái gì đó giống như một after_create trên mô hình phụ huynh, nhưng tôi không chắc chắn làm thế nào để thiết lập nó.

Trả lời

12

Đã sửa đổi: Tôi đã sửa đổi câu trả lời để sử dụng before_create và building, chứ không phải tạo, các mô hình được liên kết. Máy móc ActiveRecord sau đó sẽ chăm sóc lưu các mô hình liên quan sau khi cha mẹ được lưu.

Tôi thậm chí đã thử nghiệm mã này!

# in your Room model... 
has_many :doors 

before_create :build_main_door 

private 

def build_main_door 
    # Build main door instance. Will use default params. One param (:main) is 
    # set explicitly. The foreign key to the owning Room model is set 
    doors.build(:main => true) 
    true # Always return true in callbacks as the normal 'continue' state 
end 

####### has_one case: 

# in your Room model... 
has_one :door 
before_create :build_main_door 
private 
def build_main_door 
    # Build main door instance. Will use default params. One param (:main) is 
    # set explicitly. The foreign key to the owning Room model is set 
    build_door(:main => true) 
    true # Always return true in callbacks as the normal 'continue' state 
end 

Added ...

Phương pháp xây dựng được bổ sung bằng cách máy móc mô hình sở hữu bằng cách tuyên bố has_many. Vì ví dụ sử dụng has_many: cửa (tên cửa kiểu), cuộc gọi xây dựng là doors.build

Xem docs for has_manyhas_one để xem tất cả các phương thức bổ sung được thêm vào.

# If the owning model has 
has_many :user_infos # note: use plural form 

# then use 
user_infos.build(...) # note: use plural form 

# If the owning model has 
has_one :user_info  # note: use singular form 

# then use 
build_user_info(...) # note: different form of build is added by has_one since 
        # has_one refers to a single object, not to an 
        # array-like object (eg user_infos) that can be 
        # augmented with a build method 

Đường ray 2.x giới thiệu tùy chọn tự động lưu liên kết. Tôi không nghĩ rằng nó áp dụng cho các bên trên (tôi đang sử dụng mặc định). Autosave testing results.

+0

Mô hình con trong ví dụ của tôi được gọi là "user_info", khi tôi cố gắng thực hiện 'user_info.create (: main => true)' lỗi và nói 'undefined phương thức \ 'create 'cho nil: NilClass' – Reti

+0

thực sự, mô hình được gọi là' userInfo' – Reti

+0

Thử 'UserInfo.create' – zetetic

0

Bạn không chỉ định (hoặc tôi đã đọc nó) loại quan hệ bạn đang sử dụng. Nếu bạn đang sử dụng mối quan hệ một-một, chẳng hạn như "has_one" tạo ra sẽ không hoạt động. Trong trường hợp này bạn phải sử dụng một cái gì đó như thế này:

trong parent.rb

has_one :child 
before_create {|parent| parent.build_child(self)} 

after_create có thể làm việc là tốt, havent thử nghiệm đó.

trong khi ở child.rb

belongs_to :parent 

Tôi đã đấu tranh với điều này khá một chút khi thiết lập một mô hình sử dụng trong ứng dụng hiện tại của tôi.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html Bạn có thể thấy rằng has_one không hỗ trợ parent.build hoặc parent.create

Hope this helps. Im mới cho Ruby bản thân mình và từ từ bắt đầu thực hiện theo cách của tôi thông qua rừng rậm Ruby. Một cuộc hành trình tốt đẹp nhưng dễ bị lạc đường. :)

Các vấn đề liên quan