У меня есть три модели: Booking, ExtraNight и BookedExtraNight. Ходовые рельсы 2.3.11
Бронирование:
has_many :extra_nights, :through => :booked_extra_nights
has_many :booked_extra_nights, :dependent => :destroy
ExtraNight:
has_many :booked_extra_nights, :dependent => :destroy
has_many :bookings, :through => :booked_extra_nights
BookedExtraNight:
belongs_to :extra_night
belongs_to :booking
Теперь из-за того, как приложение работает, резервирование существует при создании booked_extra_night. Booked_extra_night создается с действием обновления бронирования.
В представлении booked_extra_night построен с использованием:
<% unless @booking.booked_extra_nights.exists? %>
<% @booking.booked_extra_nights.build %>
<% end %>
Я использую nested_form_for @booking и f.fields_for: booked_extra_nights для создания booked_extra_nights.
Теперь все работает нормально, пока я не нажму submit (обновление), когда создаются две копии booked_extra_night.
см. Журнал:
Processing BookingsController#update (for 127.0.0.1 at 2011-02-21 07:44:22) [PUT]
Parameters: {"action"=>"update", "_method"=>"put", "authenticity_token"=>"b/M+VjMxA8RFqbubhBeF494B/zhxi/2Eb3EtoCoRLx0=", "id"=>"5b2jwg7qw5na3vz4nt", "booking"=>{"booked_extra_nights_attributes"=>{"0"=> {"number_of_days"=>"2", "from_date(1i)"=>"2011", "from_date(2i)"=>"9", "from_date(3i)"=>"1", "_destroy"=>"", "extra_night_id"=>"7"}}}, "controller"=>"bookings"}
Booking Load (1.3ms) SELECT * FROM "bookings" WHERE ("bookings"."random_url_key" = '5b2jwg7qw5na3vz4nt') LIMIT 1
Variant Load (0.6ms) SELECT * FROM "variants" WHERE ("variants"."id" = 27)
SQL (0.1ms) BEGIN
SQL (0.7ms) INSERT INTO "booked_extra_nights" ("number_of_days", "created_at", "updated_at", "booking_id", "from_date", "extra_night_id") VALUES(2, '2011-02-21 06:44:22.525154', '2011-02-21 06:44:22.525154', 69, '2011-09-01', 7) RETURNING "id"
SQL (0.8ms) COMMIT
SQL (0.6ms) BEGIN
SQL (0.6ms) INSERT INTO "booked_extra_nights" ("number_of_days", "created_at", "updated_at", "booking_id", "from_date", "extra_night_id") VALUES(2, '2011-02-21 06:44:22.544452', '2011-02-21 06:44:22.544452', 69, '2011-09-01', 7) RETURNING "id"
SQL (25.8ms) COMMIT
SQL (0.1ms) BEGIN
Booking Update (0.6ms) UPDATE "bookings" SET "updated_at" = '2011-02-21 06:44:22.575409', "aasm_state" = 'step3' WHERE "id" = 69
SQL (0.5ms) COMMIT
Redirected to http://localhost:3000/bookings/5b2jwg7qw5na3vz4nt/step3
Как видите, созданы две идентичные записи, теперь, если бы я собрал 4 booked_extra_nights и нажал submit, я бы получил 8 записей.
Я также узнал, что если я создаю запись booked_extra_night в то же время, когда создается бронирование, тогда я могу добавить столько, сколько я хочу, без дубликатов.
Насколько я знаю, это происходит на всех версиях рельсов 2.3.x, так что, очевидно, я что-то не так делаю. Любая помощь будет принята с благодарностью, так как она делает мою голову.
Спасибо!