在我的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的语言列中未列出的值。
我不知道我是否应该在模型,控制器或助手中这样做
哪种是最佳做法?
提前致谢。
答案 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