Rails: ограничить перечисление столбца для уже отправленных значений - PullRequest
0 голосов
/ 02 декабря 2010

В моем приложении rails у меня есть 2 модели: post и post_translations.

class PostTranslation < ActiveRecord::Base
  belongs_to :post

  LANGUAGES = %w( en fr es de it )
  validates_inclusion_of :language, :in => LANGUAGES

end

class Post < ActiveRecord::Base
  has_many :post_translations

end

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Я бы использовал атрибут в классе вместо определения его в экземпляре.

class PostTranslation < ActiveRecord::Base
  @@languages = %w( en fr es de it )
  cattr_reader :languages

  belongs_to :post

  validates :language, :inclusion => { :in => @@languages },
    :uniqueness => { :scope => :post_id }
end

Теперь, чтобы выполнить ваше требование показа только языков без перевода, определите метод на Post:

class Post < ActiveRecord::Base
  has_many :post_translations

  def untranslated
    PostTranslation.languages - post_translations.map(&:language)
  end
end

Затем вы можете создать меню выбора, получив сообщение (@post = Post.find(params[:id]) и заполнив коллекцию из @post.untranslated.

0 голосов
/ 02 декабря 2010

Совершенно верно сохранить это в модели.Модели должны нести основную ответственность за обеспечение правильности введенных в них данных.

В вашем конкретном случае вы можете использовать валидатор :uniqueness с переданной ему областью действия.В основном ваша проверка будет гарантировать, что языки уникальны в контексте определенного поста

Должно работать следующее:

validates :language, :inclusion => { :in => LANGUAGES },
                     :uniqueness => { :scope => :post_id }

Если вы предпочитаете синтаксис стиля Rails 2, вы можете использовать:

validates_uniqueness_of :language, :scope => :post_id
...