Tìm hiểu về nested attributes
Nested attributes cho phép bạn lưu các thuộc tính trên hồ sơ liên quan thông qua cha mẹ. Mặc định trong rails thì nested atrributes updating được tắt và bạn có thể kích hoạt nó bằng cách sư dụng phương thức accepts_nested_attributes_for trong model tương ứng. Nếu muốn xác nhận rằng một bản ghi con ...
Nested attributes cho phép bạn lưu các thuộc tính trên hồ sơ liên quan thông qua cha mẹ. Mặc định trong rails thì nested atrributes updating được tắt và bạn có thể kích hoạt nó bằng cách sư dụng phương thức accepts_nested_attributes_for trong model tương ứng. Nếu muốn xác nhận rằng một bản ghi con được liên kết với một bản ghi cha, có thể sử dụng phương pháp validates_presence_of và khoá: inverse_of như sau:
class Member < ActiveRecord::Base has_many :posts accepts_nested_attributes_for :posts end
class Post < ActiveRecord::Base belongs_to :member, inverse_of: :posts validates_presence_of :member end
Lưu ý rằng nếu bạn không chỉ định tùy chọn: inverse_of, thì Active Record sẽ cố gắng tự động đoán mối liên kết ngược dựa trên heuristic.
Khi bạn sử dụng accepts_nested_attributes_for :posts trong model Member thì khi create hoặc update cho đối tượng Member bạn có thể create(update) luôn cho posts bằng cách truyền thuộc tính của posts vào member_params trong controller job
def member_params params.require(:member).permit Member::ATTRIBUTES end
Fields_for tạo ra một scope xung quanh một đối tượng cụ thể như form_for, nhưng không tạo các thẻ form. Điều này làm cho fields_for phù hợp để xác định các đối tượng mô hình bổ sung trong cùng một form của chính nó . Nói một cách đơn giản thì bạn dùng fields_for để xác định đối tượng mà bạn muốn khởi tạo hoặc cập nhật trong nested atttribute .
<%= form_for @member do |f| %> <%= f.fields_for :posts do |ff| %> <%= ff.label :title %> <%= ff.file_field :title %> <% end %> <% end %> <%= f.submit "Save", method: :update, data: {confirm: "Are you sure"} %> <% end %>
Các tùy chọn được hỗ trợ:
:allow_destroy Theo mặc định, bạn sẽ chỉ có thể thiết lập và cập nhật các thuộc tính trên mô hình liên quan. Nếu bạn muốn hủy mô hình liên kết thông qua các thuộc tính băm, bạn phải kích hoạt nó trước bằng cách sử dụng tùy chọn: allow_destroy. Cập nhật bản ghi bằng các thuộc tính hoặc đánh dấu nó để hủy nếu allow_destroy là true và has_destroy_flag? trả về true.
:reject_if Bạn cũng có thể thiết lập một: reject_if proc để âm thầm bỏ qua bất kỳ bản ghi mới nếu nó không vượt qua được tiêu chí của bạn.
:update_only Đối với mối liên hệ một-một, tùy chọn này cho phép bạn chỉ định cách nested attributes sẽ được sử dụng khi một bản ghi liên quan đã tồn tại. Nói chung, một bản ghi hiện có có thể được cập nhật với tập các giá trị thuộc tính mới hoặc được thay thế bằng một bản ghi hoàn toàn mới có chứa các giá trị đó. Mặc định tùy chọn update_only là false và các nested attributes được sử dụng để cập nhật bản ghi hiện có chỉ khi chúng bao gồm giá trị id của bản ghi. Nếu không một bản ghi mới sẽ được instantiated và được sử dụng để thay thế một hiện có. Tuy nhiên nếu tùy chọn update_only là true, các nested attributes được sử dụng để cập nhật các thuộc tính của bản ghi luôn luôn, bất kể id là có. Tùy chọn này bị bỏ qua cho các hiệp hội thu thập.