40

为了与 Ruby 在布尔方法(例如)中使用问号的习惯保持一致person.is_smart?,我想对 Rails 中的 ActiveRecord 字段做同样的事情:

rails generate model Person is_smart?:boolean

我实际上并没有运行上述语句。我假设数据库字段中不能有问号。rails 会适当地处理这个问题吗?最好的做法是简单地在模型上留下问号吗?

使用 Rails 3.2.8

4

3 回答 3

94

smart?如果有一个名为 的字段,Rails 将自动生成该方法'smart'

于 2012-09-24T05:23:38.713 回答
6

如果您碰巧: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

要了解此方法的工作原理,请参阅rails source

于 2018-04-05T10:24:06.093 回答
0

实际上,我使用的是 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
于 2014-01-20T21:08:35.193 回答