gpt4 book ai didi

ruby-on-rails-3 - 如何清除模型的 :has_many associations without writing to the database in ActiveRecord?

转载 作者:行者123 更新时间:2023-11-29 13:32:30 24 4
gpt4 key购买 nike

为了这个问题,假设我有一个非常简单的模型:

class DystopianFuture::Human < ActiveRecord::Base
has_many :hobbies
validates :hobbies, :presence => {message: 'Please pick at least 1 Hobby!!'}
end

问题是当一个人在表单上更新他们的爱好并且他们没有选择任何爱好时,我无法在不实际删除所有关联的情况下在代码中反射(reflect)这一点。

所以,假设操作看起来像这样:

def update
hobbies = params[:hobbies]
human = Human.find(params[:id])

#ideally here I'd like to go
human.hobbies.clear
#but this updates the db immediately

if hobbies && hobbies.any?
human.hobbies.build(hobbies)
end

if human.save
#great
else
#crap
end
end

注意 human.hobbies.clear 行。我想这样称呼以确保我只是在保存新的爱好。这意味着我还可以检查用户是否没有在表单上检查任何爱好。

但我不能那样做,因为它会清除数据库。除非我知道模型有效,否则我不想向数据库写入任何内容。

我在这里做错了什么?

最佳答案

最初我也是这样做的。然后找到了解决此问题的方法。

你需要做这样的事情

params[:heman][:hobby_ids]=[] if params[:human][:hobby_ids].nil?

然后检查

if human.update_attributes(params[:human])

希望你能得到一些想法...

编辑:

像这样设置爱好参数

hobbies = { hobbies_attributes: [
{ title: 'h1' },
{ title: 'h2' },
{ title: 'h3', _destroy: '1' } # existing hobby
]}

if Human.update_atttributes(hobbies) # use this condition

为此,您需要在 Human 模型中声明 accepts_nested_attributes_for :hobbies, allow_destroy: true

在这里查看更多信息 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

你可以试试https://github.com/ryanb/nested_form为了这个目的..

关于ruby-on-rails-3 - 如何清除模型的 :has_many associations without writing to the database in ActiveRecord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20323502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com