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

at.*_*at. 35 ruby activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

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

rails generate model Person is_smart?:boolean
Run Code Online (Sandbox Code Playgroud)

我实际上没有运行上述声明.我假设数据库字段中不能有问号.rails会适当地处理这个吗?简单地从模型中留下问号是最佳做法吗?

使用Rails 3.2.8

cde*_*ers 82

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

  • 实际上,Rails为所有列生成`?`方法.只有当值是真的时,它们才会返回true.所以这是布尔人的完美搭配. (28认同)
  • 实际上,开尔文上面的评论几乎是正确的.如果值为"present?",则返回true,而不是真实.所以""返回false,例如. (7认同)
  • 我从来没有错。还认为它只会检查`存在?`https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods/query.rb#L10 (3认同)
  • 是否有任何关于问号表格语义的文档? (2认同)

lac*_*der 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
Run Code Online (Sandbox Code Playgroud)

要查看此方法的工作原理,请参阅rails 源代码