Rails 6:无法删除嵌套模型。随机插入语句

时间:2019-09-06 14:23:36

标签: ruby-on-rails postgresql destroy ruby-on-rails-6 accepts-nested-attributes

我在Postgres中使用Rails 6,并在删除嵌套模型时遇到问题。 删除关联后,将生成随机插入语句。

让我解释一下我的设置。

迁移

def restore_month(month_num):
    year = int(month_num/12)+start_year #int rounds down so we can do this.
    month = month_num%12 #modulo gives us month
    return pd.Timestamp(str(year)+'-'+str(month)+'-1') #This returns the first of that month
df3 = df2.reset_index().copy() #removing month from index so we can change it.
df3['month_date'] = df3['month'].apply(lambda x: restore_month(x))

模型

class CreateEntries < ActiveRecord::Migration[6.0]
  def change
    create_table :entries do |t|
      t.string :name
      t.timestamps
    end
  end
end

class Cards < ActiveRecord::Migration[6.0]
  def change
    create_table :cards do |t|
      t.string :card_number
      t.belongs_to :entry, null: true, foreign_key: true
      t.timestamps
    end
  end
end

控制器

class Entry < ApplicationRecord
  has_one :card, dependent: :destroy
  accepts_nested_attributes_for :card, allow_destroy: true
end

class Card < ApplicationRecord
  belongs_to :entry
end

请求参数

class EntriesController < ApplicationController
    before_action :set_entry

    def update
       @entry.update(entry_params)
    end

    def set_entry
       @entry = Entry.find(params[:id])
    end

    def entry_params
      params.require(:entry).permit(:name,
        card_attributes: [:id, :card_number, :_destroy]
      )
    end
end

这些是日志

Parameters: {"authenticity_token"=>"CQ...Ucw==", "entry"=>{"card_attributes"=>{"_destroy"=>"true"}}, "id"=>"1"}

为什么在删除调用之后生成插入?甚至不是回滚。

注意:我已经尝试了Cards属地迁移到null:true和null:false。我还尝试过在Card模型中的Emirates_to:entry语句中设置optional:true

1 个答案:

答案 0 :(得分:1)

除非在id中包含card_attributes,否则Rails会将其视为新记录,因此它只是为您为新创建的has_one替换了Card(因为您的dependent: :destroy选项会删除现有的关联Card)。

最好在表单部分/视图中使用form.fields_for :card块,这将自动为现有卡添加隐藏的id标签。