gpt4 book ai didi

ruby-on-rails - 以嵌套形式实现唯一性约束

转载 作者:行者123 更新时间:2023-12-04 06:10:20 26 4
gpt4 key购买 nike

我尽量不违背这里的默认设置并使用 Rails 对嵌套属性的内置支持(来自 http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes )。我正在用标签标记事物,并且所有的工作都在膨胀,并且对于每个事物,我都有一个带有嵌套字段的表单,该字段通过名称创建一个新标签。麻烦的是,我需要确保每个标签都有一个唯一的名称。如果用户输入一个已经存在的标签的名称,而不是创建一个新标签,我需要创建与该预先存在的标签的关联。我该怎么做?

最佳答案

可能有更好的方法来做到这一点,但这是我目前能想到的最好的方法。

在 has_many(:through) 关联中,accepts_nested_arguments_for 使用对虚拟属性 #{association}_attributes 的赋值来发挥它的魔力。它需要一个哈希数组,其中每个哈希包含属性键及其值。任何带有 id 的散列都将被更新(如果 :_delete 键的值为 true,则将被删除)。任何缺少 id 的哈希将用于创建该关联的新项目。因此,关键是拦截对 tags_associations= 的调用,并检查任何缺少具有相同名称值的现有标签的 id 的哈希值,并将其替换为 tags_attributes 将使用的条目与现有标签的关联。 N.B. 对于 has_one 和 belongs_to 关系,tag_attributes 需要一个散列。代码将类似,但要简单得多。

class Thing < ActiveRecord::Base
has_many :tags, :through => :taggings
has_many :taggings
accepts_nested_attributes_for :tags

def tags_attributes_with_recycling=(attributes)
existing_attributes = attributes.reject{|attribute| attribute[:id].nil?}
new_attributes = attributes - existing_attributes
new_and_recycled_attributes = new_attributes.map { |attribute|
tag_id = Tag.find_by_name(attribute[:name]).id
tag_id ? {:id => tag_id) : attribute
}
tags_attributes_without_recycling= (existing_attributes + new_and_recycled_attributes)
end

alias_method_chain :tags_attributes=, :recycling
end

它未经测试,因此无法保证。但它至少应该让您走上解决方案的 rails 。

关于ruby-on-rails - 以嵌套形式实现唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2331515/

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