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

时间:2012-09-24 05:10:55

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.2

为了与Ruby在布尔方法中使用问号的惯用语(例如person.is_smart?)保持一致,我想对Rails中的ActiveRecord字段执行相同的操作:

rails generate model Person is_smart?:boolean

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

使用Rails 3.2.8

3 个答案:

答案 0 :(得分:78)

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

答案 1 :(得分:2)

如果您碰巧在模型中使用:enum,则需要注意一点,因为这会将值存储为整数。由活动记录提供的问号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

答案 2 :(得分: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