Rails6:无法删除嵌套模型。随机插入语句
Rails 6: Can't delete nested model. Random Insert statement
我在 Postgres 中使用 Rails 6,在删除嵌套模型时遇到问题。
删除关联后生成随机插入语句
让我解释一下我的设置。
迁移
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"}
这些是日志
(0.2ms) BEGIN
ConcessionCard Load (0.2ms) SELECT "cards".* FROM "cards" WHERE "cards"."entry_id" = LIMIT [["entry_id", 1], ["LIMIT", 1]]
Card Destroy (0.4ms) DELETE FROM "cards" WHERE "cards"."id" = [["id", 2]]
Card Create (0.6ms) INSERT INTO "cards" ("entry_id", "created_at", "updated_at") VALUES (, , ) RETURNING "id" [["entry_id", 1], ["created_at", "2019-09-06 13:50:41.100718"], ["updated_at", "2019-09-06 13:50:41.100718"]]
(0.3ms) COMMIT
为什么在删除调用之后生成插入?这甚至不是回滚。
注意:我在 Cards belongs_to 迁移中尝试了 null:true 和 null:false。我还尝试在 belongs_to 中设置 optional:true :Card 模型中的条目语句
除非您在 card_attributes
中包含 id
,否则 Rails 会将其视为新记录,因此它只是将 has_one
替换为新创建的 [=13] =] 给你(因为你的 dependent: :destroy
选项删除了现有的关联 Card
)。
最好在表单 partial/view 中使用 form.fields_for :card
块,它会自动为现有卡片添加隐藏的 id
标签。
我在 Postgres 中使用 Rails 6,在删除嵌套模型时遇到问题。 删除关联后生成随机插入语句
让我解释一下我的设置。
迁移
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"}
这些是日志
(0.2ms) BEGIN
ConcessionCard Load (0.2ms) SELECT "cards".* FROM "cards" WHERE "cards"."entry_id" = LIMIT [["entry_id", 1], ["LIMIT", 1]]
Card Destroy (0.4ms) DELETE FROM "cards" WHERE "cards"."id" = [["id", 2]]
Card Create (0.6ms) INSERT INTO "cards" ("entry_id", "created_at", "updated_at") VALUES (, , ) RETURNING "id" [["entry_id", 1], ["created_at", "2019-09-06 13:50:41.100718"], ["updated_at", "2019-09-06 13:50:41.100718"]]
(0.3ms) COMMIT
为什么在删除调用之后生成插入?这甚至不是回滚。
注意:我在 Cards belongs_to 迁移中尝试了 null:true 和 null:false。我还尝试在 belongs_to 中设置 optional:true :Card 模型中的条目语句
除非您在 card_attributes
中包含 id
,否则 Rails 会将其视为新记录,因此它只是将 has_one
替换为新创建的 [=13] =] 给你(因为你的 dependent: :destroy
选项删除了现有的关联 Card
)。
最好在表单 partial/view 中使用 form.fields_for :card
块,它会自动为现有卡片添加隐藏的 id
标签。