Ruby on rails 在Rails/ActiveRecord列名中使用问号字符

Ruby on rails 在Rails/ActiveRecord列名中使用问号字符,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Ruby On Rails 3.2,根据Ruby在布尔方法中使用问号的习惯用法(例如,person.is\u smart?),我希望对Rails中的ActiveRecord字段也这样做: rails generate model Person is_smart?:boolean 我还没有实际运行上述声明。我假设数据库字段中不能有问号。rails会适当地处理这个问题吗?最好的做法是在模型上留下问号吗 使用Rails 3.2.8Rails将自动生成方法smart?如果有一个名为'smart'的字段,实际上,我使用的是Rails 4,

根据Ruby在布尔方法中使用问号的习惯用法(例如,
person.is\u smart?
),我希望对Rails中的ActiveRecord字段也这样做:

rails generate model Person is_smart?:boolean
我还没有实际运行上述声明。我假设数据库字段中不能有问号。rails会适当地处理这个问题吗?最好的做法是在模型上留下问号吗


使用Rails 3.2.8

Rails将自动生成方法
smart?
如果有一个名为
'smart'
的字段,实际上,我使用的是Rails 4,我不能调用没有问号的布尔列

pry(main)> User.where(is_validated: false).first.is_validated
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."is_validated" = 'f' ORDER BY "users"."id" ASC LIMIT 1
=> nil
[13] pry(main)> User.where(is_validated: false).first.is_validated?
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."is_validated" = 'f' ORDER BY "users"."id" ASC LIMIT 1
=> false
如果您碰巧在模型中使用了
:enum
,则需要注意一个“问题”,因为这会将值存储为整数。active record提供的问号attr方法希望在数据库中将0或1分别评估为false/true。例如:

class Person
  enum mood: ['happy', 'sad', 'bored']
end

p = Person.new(mood: 'happy') # this would store mood as 0 in db
p.mood? #=> false

p.mood = 'sad' # saves as 1 in db
p.mood? #=> true

p.mood = 'bored' # saves as 2 in db
p.mood? #=> true

要了解这种方法的工作原理,请参见

为什么不直接将其命名为
智能
,然后添加自定义访问器,以便在与真人交谈时可以说
智能吗?
。@matt-我想这是最有意义的,因为在末尾用问号命名布尔变量并不常见,我们将处理上述
智能吗?
作为变量。Rails是您的朋友。请参阅Cdesrosiers的答案。实际上Rails为所有列生成
方法。只有当值为truthy时,它们才会返回true。因此,这是一个完美的匹配布尔人。事实上,开尔文的评论上面几乎是正确的。如果值为
present?
,则返回true,而不是truthy。例如,所以“”返回false。是否有关于问号形式语义的文档?我从来没有犯过这样的错误。我还以为它只会检查
present?
…记住:在rails中,在你的方法和专栏中设置像'is_uuu'或'has_uuu'这样的前缀是不好的做法。在回答了这个问题之后,我在这个主题上发表了一篇“询问/回答”的帖子,但我保留了这个,因为我认为这些信息对于决定如何命名布尔列也很有价值。这并不是说你不能在没有问号的情况下调用布尔列。它实际上显示了您存储在迁移中的col.add
null:false、default:false
子句中的实际值。