我正在使用Ruby on Rails 3.0.7,我想在运行时找到一些记录用于验证,但是传递\为该finder方法设置一个值。也就是说,在我的课堂上,我有以下内容:
class Group < < ActiveRecord::Base
validates :relation_id,
:presence => true,
:inclusion => {
:in => ... # Read below for more information about
}
end
如果我将:in
设为
:in => User.find(1).group_ids
它有效,但我想为finder方法设置“some-dynamic-things”,而不是下面示例中所述的1
值。也就是说,我想做以下的事情,以便在某种程度上传递给模型<test_value>
:
class Group < < ActiveRecord::Base
validates :relation_id,
:presence => true,
:inclusion => {
:in => User.find(<test_value>).group_ids
}
end
有可能吗?如果是这样,我怎样才能将值传递给常量?
P.S。:只是要知道,我试图将其从控制器移动到模型中。
答案 0 :(得分:1)
我推断你要做的是强制执行类似“只有属于某个组成员的用户才能保存它”的内容。如果是这种情况,那么您的行为应该留在控制器中。
您的模型无法访问当前会话,添加此逻辑将阻止您将来使用模型进行其他操作。例如,您永远无法从与用户无关的批处理或维护作业中保存组。
如果您真的想要这样做,可以在current_user
对象中添加User
类级别变量并将其设置为before_filter
...
class ApplicationController
before_fitler :set_current_user
def set_current_user
User.current_user = #however you get your user in your controllers
end
end
class User
@@current_user
end
class Group
validates :user_in_group
def user_in_group
return true unless User.current_user #if we don't have a user set, skip validation
User.current_user.group_ids.include? self.id
end
end
答案 1 :(得分:0)
看起来你想要为:in属性的验证器运行类似proc的东西。我认为当你依赖于模型的加载顺序并使用“动态常量”时,你可能会陷入危险的境界。
相反,如何为这种情况建立自己的自定义验证器呢?
这并不难,你可以完全控制你的需要:
http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-validation-methods