我正在尝试实现将字符串数组传递给has_many
关联的功能,以便可以迭代它们并创建关联实例。
我的结构简单Task <-> TaskTag <-> Tag
Task
和Tag
都有一个字段:title
我愿意通过这样的调用来实现更新:
@task.update({:title=>"Updated Task Title", :tags=>["NewTag", "ExistingTag"]})
以便它创建并设置标题为“ NewTag”的标签,并设置“ ExistingTag”
class Task < ApplicationRecord
attr_accessor :tags
before_save :set_tags, if: -> { self.tags.present? }
has_many :task_tags
has_many :tags, through: :task_tags
accepts_nested_attributes_for :tags
private
def set_tags
tag_instances = self.tags.map do |tag|
if tag.is_a?(String)
Tag.where(title: tag).first_or_create
else
tag
end
end
self.tags = tag_instances
end
end
我已经实现,如果它不存在,它将创建实例,但是不会创建TaskTag
实例
答案 0 :(得分:1)
我已经实现了它创建实例(如果它不存在),但是它 不创建TaskTag实例
通常在has_many,<> :through
关联中,当collection_singular_ids
中存在tag_ids
(即您的情况下为task_ids
或params
)时,Rails在创建时,还将在联接表(即您的情况下为task_tags
)中创建新条目,其中f_key
的值为{{1} }({collection_singular_ids
)和 当前实例的ID (tag_id = tag_ids
)。
您的情况有所不同,因为您拥有task_id = @task.id
而不是tags
。您应该像这样为tag_ids
创建实例
TaskTag