用于验证目的的动态查找器方法

时间:2011-07-03 19:31:59

标签: ruby-on-rails ruby ruby-on-rails-3 validation constants

我正在使用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。:只是要知道,我试图将其从控制器移动到模型中。

2 个答案:

答案 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