2

考虑一个模型用户:

User(id: integer, name: string, email: string, status: string)

当我构建应用程序时,状态是数据库中的一个字段。但是新的要求意味着改变,因此在某些情况下动态计算状态。例如,在星期天,如果他们的姓氏以 A 开头,那么他们的状态是“不正常”。

我想将此功能封装在 User 模型中,如下所示

Class User < ActiveRecord::Base

  def status
    if is_sunday && last_name.starts_with('A')
        return 'not ok'
    else
       return status
    end
  end

end

做这个的最好方式是什么?如果上面的代码确实有效,那么用方法覆盖数据库中的字段似乎是不好的做法。

或者,我可以创建一个方法get_status来使用上述代码。但在这种情况下,我需要更改status整个应用程序中的每个引用。这听起来不太好。

4

1 回答 1

4

我在ActiveRecord::Base 文档中看到您可以覆盖 ActiveRecord 提供的默认访问器。当然,您不能status像以前那样使用,因为它使该方法有些递归。

您可以使用read_attribute(:attribute_name)或者self[:attribute_name]如果您愿意,可以访问数据库中的列值。长话短说,你的访问者变成了:

Class User < ActiveRecord::Base
  def status
    if is_sunday && last_name.starts_with('A')
      'not ok'
    else
      read_attribute(:status)
    end
  end
end

更新:我已经尝试过它并且它有效,但请注意,因为如果您不明确调用此方法,您将获得数据库内容......例如,您尝试查询users表以查找用户status = "not ok"可能会有惊喜。

于 2012-04-06T22:49:55.187 回答