В Rails, как вы меняете новый объект на существующий? - PullRequest
2 голосов
/ 30 мая 2011

У меня есть следующие отношения вложенных моделей:

  • Страны (id, имя)
    • Провинции (id, country_id, name)
      • Города (id, провинция_ид, название)

У меня есть validates_uniqueness_of ограничение на поля имени для каждой модели в отношении и уникальный индекс для столбцов имени в базе данных.

Я хочу поменять местами новый объект, созданный с тем же именем, что и существующая запись, в какой-то момент до ее проверки. Другими словами, если пользователь пытается добавить комбинацию города, провинции, страны, которая уже была добавлена, я хочу, чтобы модель страны возвращала ссылку на соответствующие записи существующей модели вместо сбоя проверки перед сохранением.

У меня проблемы с использованием обратных вызовов модели (after_initialize, before_validation и т. Д.), И я не смог заставить Country.find_or_initialize_by_name работать с вложенными моделями ... есть предложения?

1 Ответ

1 голос
/ 30 мая 2011

То, что вы пытаетесь сделать, звучит довольно сложно и, вероятно, потребует, чтобы вы знали много внутренних деталей реализации ActiveRecord::Base.

Вместо этого, вы могли бы сделать что-то подобное?

@country = Country.find_or_initialize_by_name(params[:name])
...
@country.save

РЕДАКТИРОВАТЬ: ActiveRecord имеет встроенные функции find_or_create_by_XXX и find_or_initialize_by_XXX, поэтому нет необходимости добавлять функцию в модель.Для получения дополнительной информации см. Раздел «Динамические искатели на основе атрибутов» http://api.rubyonrails.org/classes/ActiveRecord/Base.html

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