Как разобрать ассоциацию has_many before_save - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь получить возможность передавать массив строк в 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 экземпляр

1 Ответ

0 голосов
/ 16 октября 2018

Я достиг того, что он создает экземпляр, если он не существует, но он не создает экземпляр TaskTag

Обычно в has_many,<> :through ассоциации, когда collection_singular_ids (то есть,tag_ids или task_ids в вашем случае) присутствуют в params, Rails при создании также создаст новых записей в объединенной таблице (то есть task_tagsв вашем случае) с f_key значениями в качестве этих значений collection_singular_ids (tag_id = tag_ids) и id текущего экземпляра (task_id = @task.id).

Ваша ситуация иная, поскольку у вас tags вместо tag_ids.Вы должны создать экземпляры для TaskTag примерно так

def set_tags
  tag_instances = self.tags.map do |tag|
    if tag.is_a?(String)
      Tag.where(title: tag).first_or_create do |t|
        t.task_tags.create(task_id: self.id) # This will create new entries for task_tags with tag_id as t.id and task_id as self.id
      end
    else
      tag
    end
  end
  self.tags = tag_instances
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...