【问题标题】:Using question mark character in Rails/ActiveRecord column name在 Rails/ActiveRecord 列名中使用问号字符
【发布时间】:2012-09-15 13:33:52
【问题描述】:

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

rails generate model Person is_smart?:boolean

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

使用 Rails 3.2.8

【问题讨论】:

  • 为什么不直接称它为smart,然后添加自定义访问器,这样当你与一个实际的人交谈时,你就可以说is_smart?
  • @matt - 我想这是最有意义的,因为您通常不会在末尾使用问号命名布尔变量,我们会将上述 is_smart? 视为变量。
  • Rails 是你的朋友。请参阅 Cdesrosiers 的回答。

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


【解决方案1】:

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

【讨论】:

  • 实际上 Rails 为所有列生成? 方法。只有当值是真实的时,它们才会返回 true。所以这是布尔值的完美匹配。
  • 其实上面Kelvin的评论几乎是对的。如果值为present?,则返回true,而不是truthy。例如,“”返回 false。
  • 问号形式的语义有文档吗?
  • 我从来没有这么错。还认为它只会检查present? github.com/rails/rails/blob/master/activerecord/lib/…
  • ...记住:在你的方法和列stackoverflow.com/questions/37059547/…
【解决方案2】:

如果您碰巧在模型中使用: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

【讨论】:

    【解决方案3】:

    实际上,我使用的是 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
    

    【讨论】:

    • 这并不是说你不能在没有问号的情况下调用布尔值。它实际上显示了您存储在 col 中的实际值。在迁移中添加null: false, default: false 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多