【发布时间】:2013-05-12 10:10:36
【问题描述】:
在带有 Postgres 版本 9.1.9 的 Heroku Cedar 堆栈上运行的 Rails 3.2.2 应用程序中。
在执行以下方法时:
class Post < ActiveRecord::Base
def shared_to_all
privacy & 1 == 1
end
end
我遇到了这个错误:
Completed 500 Internal Server Error in 19ms
NoMethodError (undefined method `&' for "0":String):
app/models/post.rb:75:in `shared_to_all'
app/controllers/application_controller.rb:212:in `next_post'
“隐私”在 heroku 数据库的 DDL 中定义为“int4 DEFAULT 0”。 该应用程序在本地使用相同的 rails 框架/gems/数据库运行良好,甚至在使用 heroku 运行控制台时:
irb(main):008:0> Post.first.shared_to_all
=> false
irb(main):009:0> Post.first.privacy.class
=> Fixnum
irb(main):010:0> Post.first.privacy & 1 == 1
=> false
【问题讨论】:
-
这与您的问题无关,但是,您为什么使用按位运算符而不是
zero?方法? -
@Pigueiras 因为隐私是我使用的位串,而不是一堆布尔列。隐私中的每一位都控制着一些权限。
-
不太清楚你在做什么,但为什么不使用
privacy.present?或privacy.to_i或类似的东西? -
@mind.blank 隐私始终存在,默认为 0,不能为 nil。只有当它被证明是最佳实践时,我才会进行类型转换,目前,转换整数 .to_i 似乎很愚蠢
-
&和&&是两个完全不同的东西。前者是位运算符,后者是逻辑运算符。5 & true或"string" & true你不能这样做,它们没有任何意义。
标签: ruby-on-rails postgresql heroku cedar