【问题标题】:Is "active" a keyword in rails?“活动”是rails中的关键字吗?
【发布时间】:2014-04-15 07:14:11
【问题描述】:

我正在使用列名为“活动”的“客户”表。列的类型是 tinyint(1)(布尔值)。对于特定客户,该列在数据库中的值为 1。以下是我在 Rails 控制台上看到的客户记录。

    2.1.0 :029 > customer.active
    => true 
    2.1.0 :030 > customer.active?
    => false 

不应该是“customer.active”吗?返回真而不是假?我通过将列名重命名为“启用”来检查。在这种情况下,它对“customer.enabled”和“customer.enabled?”都返回true。是因为在 Rails 或 ActiveRecord 代码中将“活动”词用于其他目的吗?

【问题讨论】:

  • 我会设置一个调试器,单步执行每个.active 调用,然后看看结果如何! C-;
  • 活跃的?函数是自动生成的,表格的每一列也会有一个相应的函数像这样生成。我不确定这些的功能是什么。
  • @vee 实际上,我认为 rails (4) 对抽象 tinyint(1) 列有一些魔力。在我的项目中,该类型的列将给出真或假(即使该值手动设置为 1 或 0)。在我的情况下,返回的值与查询表单“?”一致,我不知道为什么 OP 会出现不一致。

标签: ruby-on-rails


【解决方案1】:

为了直接回答您的问题,我打开了 rails 控制台并输入了以下代码:

 :006 > class Entity < ActiveRecord::Base
 :007?>   end
 => nil 
 :008 > entity = Entity.new
 => #<Entity id: nil> 
 :009 > entity.active
NoMethodError: undefined method `active' for #<Entity id: nil>
 :010 > entity.active?
NoMethodError: undefined method `active?' for #<Entity id: nil>

请注意,您应该创建表 entities 来启动此代码

这表明activeactive? 都不是默认模型方法。

自动生成带有列名和问题的方法,例如,如果您有布尔列active ActiveRecord 将生成active? 方法。

如果您的方法返回的值不是列的值,您可以检查您是否在模型中重新定义了您的方法。可以直接在模型代码中重新定义,也可以在使用的可以自己添加一些方法的gem中重新定义。

例如有state_machine gem 自己添加了active? 方法

顺便说一句,如果你想找到你的方法定义,你可以使用下面的代码:

Customer.ancestors

获得祖先链。比你可以迭代地检查每个祖先:

Customer.ancestors.select{|a| a.instance_methods.grep(/^active$/).any?}

用所需的方法获取祖先。

【讨论】:

  • 活跃的?方法不会在任何祖先中定义,它将是模型本身的实例方法(大概使用define_method定义)
  • 你是对的。但默认情况下,它应该返回布尔字段的值。将此添加到答案中。
  • 尼古拉,我认为你是对的。我创建了一个带有默认设置的新项目来测试和“活动?”方法按预期工作。正如你所建议的,我检查了“活动?”我包含的 gem 的代码中的方法,我在 state_machine gem(我正在使用)中找到了它。我认为这引起了问题。我将把我的字段重命名为“启用”以避免冲突。感谢您的帮助!
  • 您应该编辑您的答案以指定该特定 gem 将为未来的读者添加 active 方法。
  • 添加了这个和来自 rails 控制台的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2014-05-23
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多