Как использовать значение аргумента для построения метода `.collection` для связанной модели? - PullRequest
1 голос
/ 08 ноября 2019

Я не уверен, какова правильная терминология для моего вопроса, но возможно ли использовать значение аргумента, чтобы "построить" его соответствующий .collection метод?

Например, Submission has_many images, теги и документы. И в зависимости от того, с чем взаимодействует пользователь, я бы хотел создать соответствующую ассоциацию.

Изначально я настроил ее только для тегов ...

def add_to_submission(task, user, tag)
  sub = Submission.find_or_create_by(task: task, user: user)
  sub.tags << tag
end

НоЕсть ли способ, которым я могу обобщить это дальше, так что третий аргумент может быть более динамичным? Таким образом, вместо только допускается тег, его можно использовать как

add_to_submission(@task, @current_user, @new_image)

Что-то вроде ...

def add_to_submission(task, user, associated_item)
  sub = Submission.find_or_create_by(task: task, user: user)
  items = associated_item.pluralize
  sub.items << associated_item
end

1 Ответ

1 голос
/ 08 ноября 2019

Для динамического вызова методов можно использовать .send. Вы можете передать символ имени метода. Вы должны быть в состоянии сделать что-то подобное, но я бы порекомендовал вам хорошие юнит-тесты для вашего метода.

def add_to_submission(task, user, associated_item)
  submission = Submission.find_or_create_by(task: task, user: user)
  children = associated_item.pluralize.to_sym
  submission.send(children) << associated_item
end
...