我在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
答案 0 :(得分:1)
除非在id
中包含card_attributes
,否则Rails会将其视为新记录,因此它只是为您为新创建的has_one
替换了Card
(因为您的dependent: :destroy
选项会删除现有的关联Card
)。
最好在表单部分/视图中使用form.fields_for :card
块,这将自动为现有卡添加隐藏的id
标签。