has_many accepts_nested_attributes_for вопрос ассоциации - PullRequest
2 голосов
/ 24 февраля 2011

Я новичок в рельсах и извиняюсь, если это вопрос n00b.

Я делаю обязательный сайт управления рецептами и хочу, чтобы у каждого рецепта был список тегов (где тег db просто содержит строку с именем "name"). Вот мои модели, чтобы дать вам некоторый контекст:

class Recipe < ActiveRecord::Base
  has_many :links
  has_many :tags, :through => :links
  validates :name, :ingredients, :directions, :presence => true
  accepts_nested_attributes_for :tags,
        :allow_destroy => true,
        :reject_if => :reject_tag

  def reject_tag(a)
      ...
  end
end

class Tag < ActiveRecord::Base
  has_many :links
  has_many :recipes, :through => :links
end


class Link < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :tag
end

По сути, каждый рецепт имеет список тегов в таблице соединительных ссылок и наоборот. Форма рецепта принимает вложенные атрибуты для тегов. Я хочу, чтобы дублированные теги не вводились в таблицу тегов, а просто создавалась новая ссылка, указывающая на уже существующий тег. Поэтому, если у меня есть тег с именем «Здоровый», введите новый рецепт и добавьте к нему тег «Здоровый», я не хочу дублировать теги «Здоровый» в таблице тегов. Все, что нужно, - это новая запись в таблице ссылок, связывающая новый рецепт со старым тегом.

Что такое «рельсовый» подход к этому. Прямо сейчас я пытаюсь взломать его, передав recipe_id из скрытого поля ввода в: reject_if lambda и сохранив там новую ссылку. Он работает для редактирования существующего рецепта, но не для создания нового, так как recipe.id еще нет. Это похоже на плохой подход, и я просто не знаю, как это сделать. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я думаю, что на ваш вопрос здесь ответят: accept_nested_attributes_for with find_or_create?

0 голосов
/ 24 февраля 2011

Можете ли вы дважды проверить дизайн вашей модели?Кажется, что рецепт и тег имеют отношение HABTM через Link вместо has_many с обеих сторон.Как только вы это сделаете, проблема дублирования должна быть решена / легко решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...