首先,让我说我对Rails是extremely个新手(曾经玩过一两次,但现在强迫自己用它写一个完整的项目,昨天就开始了).

我现在试图验证模型属性(术语?)比另一个更伟大.对于validates_numericality_ofgreater_than选项来说,这似乎是一个完美的例子,但遗憾的是,这会导致一个错误,告诉我greater_than expects a number, not a symbol.如果我试着输入.to_f,我会得到一个undefined method错误.

以下是我最终做的事情,我很好奇是否有更好的方法.这只是一个控制项目发布的简单系统,我们只有主要/次要发布(一个点),所以float在这里感觉是正确的决定.

class Project < ActiveRecord::Base
    validates_numericality_of :current_release
    validates_numericality_of :next_release
    validate :next_release_is_greater

    def next_release_is_greater
        errors.add_to_base("Next release must be greater than current release") unless next_release.to_f > current_release.to_f
    end
end

这是有效的——它通过了相关的单元测试(下面是为了让你观看的乐趣),我只是好奇是否有更简单的方法——我本可以try 其他方法.

相关单元测试:

# Fixture data:
#   PALS:
#     name: PALS
#     description: This is the PALS project
#     current_release: 1.0
#     next_release: 2.0
#     project_category: 1
#     user: 1
def test_release_is_future
    project = Project.first(:conditions => {:name => 'PALS'})
    project.current_release = 10.0
    assert !project.save

    project.current_release = 1.0
    assert project.save
end

推荐答案

正如您所注意到的,唯一的方法是使用自定义验证器.

class Project < ActiveRecord::Base
  validates_numericality_of :current_release
  validates_numericality_of :next_release, :greater_than => :current_release
end

greater_than选项的目的是根据静态常量或其他类方法验证值.

所以,不要介意,继续使用您的自定义验证器.:)

Ruby-on-rails相关问答推荐

rails中Net::STP的多文件模式

有没有一种方法可以点击一个按钮来冒泡到父元素?

无法在 Rails 中使用 wkhtmltopdf 写入临时文件

Rails 7 - 富文本不显示附加的媒体内容

使用拆分成多个部分的种子文件进行Rails数据种植

错误原始错误:未安装 ImageMagick/GraphicsMagick

如何在 IRB/Rails 控制台中 suppress 返回值的输出?

如何配置设计以使用自定义邮箱布局?

查找日期时间与今天匹配的记录 - Ruby on Rails

如何从 Rails 路由中删除控制器名称?

如何避免 has_many :through 关系中的重复?

禁用 RVM 或使用没有 RVM 安装的 Ruby?

如何在 routes.rb 中使用 301 或 302 进行重定向

URL中的Rails点而不是斜杠

如何在 Windows 上为 Ruby 安装 sqlite3?

设计记住我和会话

Rails 4 pgsql add_index 类型为 GIN 或 GiST

如何对这个哈希数组进行分组?

过滤器在渲染之前但在控制器之后执行?

如何在不触及 updated_at 属性的情况下更新单个属性?