Ruby on rails 在中创建的重复记录有多个:通过关联

Ruby on rails 在中创建的重复记录有多个:通过关联,ruby-on-rails,associations,has-many-through,duplicate-data,Ruby On Rails,Associations,Has Many Through,Duplicate Data,我有三种型号:预订、ExtraNight和BookedExtraNight。运行轨道2.3.11 预订: 夜间: BookedExtraNight: 现在,由于应用程序的工作方式,在创建预订的额外住宿时,预订就存在了。通过预订更新操作创建预订的额外住宿。 在视图中,预订的额外住宿使用以下方式构建: <% unless @booking.booked_extra_nights.exists? %> <% @booking.booked_extra_nights.build

我有三种型号:预订、ExtraNight和BookedExtraNight。运行轨道2.3.11

预订:

夜间:

BookedExtraNight:

现在,由于应用程序的工作方式,在创建预订的额外住宿时,预订就存在了。通过预订更新操作创建预订的额外住宿。 在视图中,预订的额外住宿使用以下方式构建:

<% unless @booking.booked_extra_nights.exists? %>
   <% @booking.booked_extra_nights.build %>
<% end %>
正如您所看到的,创建了两个相同的记录,现在如果我要创建4个预订的额外住宿,然后按submit,我将得到8个记录

我还发现,如果我在创建预订的同时创建一个预订的额外夜间记录,那么我可以添加任意数量的内容,而不需要重复。 据我所知,这在所有2.3.x版本的rails上都会发生,所以这显然是我做错了。任何帮助都将不胜感激,因为这会让我头痛不已


谢谢

我也遇到了这个问题,我的解决方案是在我的控制器中,不使用构建,使用new并提供父参数

在我的代码中提取。。而不是使用

我用

首先将此对象作为空对象添加到@company中,然后在提交其创建操作时创建另一个新对象


第二种方法只是为了表单的目的在内存中创建一个新对象,但是当值提交到创建操作时,没有与公司相关的对象

我也遇到了这个问题,我的解决方案是在我的控制器中,不使用构建,使用new并提供父参数

在我的代码中提取。。而不是使用

我用

首先将此对象作为空对象添加到@company中,然后在提交其创建操作时创建另一个新对象


第二个只是为了表单的目的在内存中创建一个新对象,但是当值提交到创建操作时,没有对象绑定到公司

谢谢,Rabbot!遗憾的是,你让我走上了正确的轨道,但是更新的过程一团糟。 我已经重新考虑过了,现在一切都正常了,我想这两次保存都与我有关,首先更新预订,然后重定向,然后通过AASM再次更新预订

下面是我告诉过你的旧更新操作,它一团糟:

这是一个新的、经过重新考虑的更新操作

功能相同,多行少。而且它不会产生重复的额外夜晚


谢谢,拉博特。你的回答让我思考,因为我曾多次尝试在视图和模型中更改内容,但都没有成功。我只是假设控制器可以工作,因为它可以处理所有其他事情。

谢谢,Rabbot!遗憾的是,你让我走上了正确的轨道,但是更新的过程一团糟。 我已经重新考虑过了,现在一切都正常了,我想这两次保存都与我有关,首先更新预订,然后重定向,然后通过AASM再次更新预订

下面是我告诉过你的旧更新操作,它一团糟:

这是一个新的、经过重新考虑的更新操作

功能相同,多行少。而且它不会产生重复的额外夜晚


谢谢,拉博特。你的回答让我思考,因为我曾多次尝试在视图和模型中更改内容,但都没有成功。我只是假设控制器可以工作,因为它可以处理其他所有事情。

不确定,但可能会自动创建一条记录?尝试删除并检查它不是自动创建的,但是当我删除构建并检查日志时,我看到了:SQL 0.1ms BEGIN SQL 0.1ms COMMIT SQL 0.1ms BEGIN SQL 0.1ms COMMIT SQL 0.1ms BEGIN Booking Update 0.9ms Update bookings SET updated_at='2011-02-21 20:54:02.814578',aasm_state='step3',其中id=69 SQL 0.7ms COMMIT对于一个简单的更新来说是大量的提交不确定,但是可能会自动创建一条记录?尝试删除并检查它不是自动创建的,但是当我删除构建并检查日志时,我看到了:SQL 0.1ms BEGIN SQL 0.1ms COMMIT SQL 0.1ms BEGIN SQL 0.1ms COMMIT SQL 0.1ms BEGIN Booking Update 0.9ms Update bookings SET updated_at='2011-02-21 20:54:02.814578',aasm_state='step3',其中id=69 SQL 0.7ms COMMIT对于一个简单的更新来说,这是一个大量的提交。问题似乎是关联,但我处理更新操作的方式。谢谢你给我检查控制器的主意。我还没有解决它,但我至少离它更近了。你能提供更新操作中使用的代码,以便我们可以帮助调试它吗?问题似乎是关联,但我处理更新操作的方式。谢谢你给我检查控制器的主意。我还没有解决它,但我至少离它更近了。您能提供更新操作中使用的代码,以便我们可以帮助调试它吗?
has_many :booked_extra_nights, :dependent => :destroy
has_many :bookings, :through => :booked_extra_nights
belongs_to  :extra_night
belongs_to  :booking
<% unless @booking.booked_extra_nights.exists? %>
   <% @booking.booked_extra_nights.build %>
<% end %>
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
@new_brand = @company.brands.build/new
@new_brand = Brand.new(:company => @company)
def update
  @booking = Booking.find_by_random_url_key(params[:id])
  @variant = @booking.variant
  if params[:back_button]
    if @booking.aasm_state == "step2"
      redirect_to booking_step1_url(@booking)
    elsif @booking.aasm_state == "step3"
      redirect_to booking_step2_url(@booking)
    elsif @booking.aasm_state == "step4"
      redirect_to booking_step3_url(@booking)
    elsif @booking.aasm_state == "step5"
      redirect_to booking_step4_url(@booking)
    end
    @booking.previous!
  else
    if @booking.update_attributes(params[:booking]) && @booking.aasm_state == "step1"
      redirect_to booking_step2_url(@booking)
      @booking.next!
    elsif @booking.update_attributes(params[:booking]) && @booking.aasm_state == "step2"
      @booking.next!
      redirect_to booking_step3_url(@booking)
    elsif @booking.update_attributes(params[:booking]) && @booking.aasm_state == "step3"
      redirect_to booking_step4_url(@booking)
      @booking.next!
    elsif @booking.update_attributes(params[:booking]) && @booking.aasm_state == "step4"
      redirect_to booking_url(@booking)
      @booking.next!
    end
  end
end
  def update
    @booking = Booking.find_by_random_url_key(params[:id])
    @variant = @booking.variant
    if params[:back_button]
      @booking.previous!
      redirect_to :controller => "bookings", :action => "#{@booking.aasm_state}", :id => @booking
    else
      @booking.update_attributes(params[:booking])
      @booking.next!
      redirect_to :controller => "bookings", :action => "#{@booking.aasm_state}", :id => @booking
    end
  end