【问题标题】:Are timestamp columns meant respond to boolean method calls?时间戳列是否意味着响应布尔方法调用?
【发布时间】:2014-02-11 15:07:20
【问题描述】:

我刚刚注意到我可以在 AR 时间戳上调用布尔方法。我可以依赖这种行为,还是它是一个小故障?

foo.updated_at? #=> true if not nil, but false if nil

如果我有一个@task.completed_on 列,这很有用。我可以使用completed_on 来确定任务是否已完成(有时间戳,或者为零)。

@task.completed?
class Task < ActiveRecord::Base
  def completed?
    completed_on?
  end
end

【问题讨论】:

  • 我怀疑这是一个小故障,因为 AR 使用 method_missing 来创建这些方法。他们一定是故意创造的。
  • [36] pry(main)> User.last.updated_at? SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 => true 看看它执行了什么希望你知道它是什么
  • @RajarshiDas 我应该在寻找什么?

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 rails-activerecord


【解决方案1】:

Rails 为 ActiveRecord 模型中的所有属性提供谓词方法(返回布尔值并以问号为后缀的方法),无论数据库中列的类型如何,如果它有值则返回 true,否则返回 false它是零。这根本不是故障。

您可以在持久化或最近初始化的模型中使用这种方法,如下所示:

u = User.find_by(email: "foo@bar.com") 
u.email? # => true

u = User.new(email: "new@user.com")
u.email? # => true

你完全可以依赖这种行为。甚至建议您将视图中的小条件以及编写方法的优雅方式(就像您在 completed? 示例中所做的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2012-12-10
    • 2014-08-15
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多