How to synchronize the has_many association using accepts_nested_attributes_for using foreign_key instead of ID?

I would like to synchronize the has_many association by foreign key. It seems I need to write my own code for this. Is there a Rails / Active Record magic / Gem to achieve this? In particular, I would like to synchronize the connection table where the foreign key pairs must be unique.

class Food < ActiveRecord::Base
  has_many :food_tags, :dependent=>:destroy, :inverse_of => :food
  accepts_nested_attributes_for :food_tags, :allow_destroy => true
end

class FoodTag < ActiveRecord::Base
  belongs_to :tag, :inverse_of=>:food_tags
  belongs_to :food, :inverse_of=>:food_tags
end

class Tag < ActiveRecord::Base
  has_many :food_tags, :dependent=>:destroy, :inverse_of=>:tag
  has_many :foods, :through=>:food_tags
end

For my form with nested attributes (or my JSON API), I would really like to omit the FoodTag identifier and use tag_id to synchronize when updating the power.

I want to send this an update to show that the tag is installed or cleared

# this one is set
food[food_tag_attributes][0][tag_id]   = 2114
food[food_tag_attributes][0][_destroy] = false

# this one is cleared
food[food_tag_attributes][1][tag_id]   = 2116
food[food_tag_attributes][1][_destroy] = true

Instead, I should send this for an update:

# this one is set
food[food_tag_attributes][0][id]       = 109293
food[food_tag_attributes][0][tag_id]   = 2114
food[food_tag_attributes][0][_destroy] = false

# this one is cleared
food[food_tag_attributes][0][id]       = 109294
food[food_tag_attributes][1][tag_id]   = 2116
food[food_tag_attributes][1][_destroy] = true

, , .

? , before_save Food, , .

+4
1

, : fields_for . foreign_key. foreign_key .

EDIT:

<%= form_for @person do |person_form| %> <%= person_form.text_field :name %> <% @person.addresses.each do |address| %> <%= person_form.fields_for address, **index**: address.id do |address_form|%> <%= address_form.text_field :city %> <% end %> <% end %> <% end %>

0

All Articles