Rails:限制已提交值的枚举列

时间:2010-12-02 15:02:52

标签: ruby-on-rails ruby-on-rails-3 enums model associations

在我的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 个答案:

答案 0 :(得分:1)

我在类上使用了一个属性,而不是在实例上定义它。

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填充集合来构建选择菜单。

答案 1 :(得分:0)

将其保留在模型中是完全有效的。模型应负主要责任,确保输入的数据正确无误。

对于您的特定情况,您可以使用传递范围的:uniqueness验证程序。基本上,您的验证将确保语言在特定帖子的上下文中是唯一的

以下内容应该有效:

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

如果您更喜欢Rails 2样式语法,可以使用:

validates_uniqueness_of :language, :scope => :post_id