gpt4 book ai didi

ruby-on-rails - 在 Rails 中,update_attributes 的倒数是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:11 24 4
gpt4 key购买 nike

在 Rails 中,update_attributes! 的逆运算是什么?

换句话说,是什么将记录映射到属性散列以重新创建该记录及其所有子记录?

答案不是 ActiveRecord.attributes,因为它不会递归到子对象中。

澄清您是否有以下情况:

class Foo < ActiveRecord::Base
has_many :bars
accepts_nested_attributes_for :bars
end

然后你可以像这样传递一个散列

{"name"=> "a foo", "bars_attributes"=> [{"name"=> "a bar} ...]}

update_attributes。但目前尚不清楚如何为此目的以编程方式轻松生成这样的哈希值。

编辑:
正如我在评论中提到的,我可以做类似的事情:
foo.as_json(:include => :bars)

但我想要一个使用 accepts_nested_attributes_for :bars 声明的解决方案,以避免必须显式包含关联。

最佳答案

不确定这将如何“反转”,但虽然 Rails 可能没有“答案”,但没有什么能阻止您遍历对象并非常有效地创建它。

让你开始的东西:

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

您会注意到在 accepts_nested_attributes_for 方法中,rails 在 nested_attributes_options 中为所有嵌套的模型设置了一个散列。所以我们可以使用它来获取这些嵌套关联,以填充这个新的哈希值。

def to_nested_hash
nested_hash = self.attributes.delete_if {|key, value| [:id, :created_at, :deleted_at].include? key.to_sym } # And any other attributes you don't want

associations = self.nested_attributes_options.keys
associations.each do |association|
key = "#{association}_attributes"
nested_hash[key] = []
self.send(association).find_each do |child|
nested_hash[key] << child.attributes.delete_if {|key, value| [:id, :created_at, :deleted_at].include? key.to_sym }
end
end

return nested_hash
end

或者只是想到这个:

使用上面的示例:

foo.as_json(:include => foo.nested_attributes_options.keys)

需要注意的一点是,这不会为您提供我的第一个建议所提供的 bars_attributes。 (serializable_hash 也不会)

关于ruby-on-rails - 在 Rails 中,update_attributes 的倒数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410565/

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