如何解析has_many关联before_save

时间:2018-10-16 18:35:27

标签: ruby-on-rails ruby activerecord

我正在尝试实现将字符串数组传递给has_many关联的功能,以便可以迭代它们并创建关联实例。

我的结构简单Task <-> TaskTag <-> Tag

TaskTag都有一个字段: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实例

1 个答案:

答案 0 :(得分:1)

  

我已经实现了它创建实例(如果它不存在),但是它   不创建TaskTag实例

通常在has_many,<> :through关联中,当collection_singular_ids中存在tag_ids(即您的情况下为task_idsparams)时,Rails在创建时,还将在联接表(即您的情况下为task_tags)中创建新条目,其中f_key的值为{{1} }({collection_singular_ids)和 当前实例的ID tag_id = tag_ids)。

您的情况有所不同,因为您拥有task_id = @task.id而不是tags。您应该像这样为tag_ids创建实例

TaskTag