过载"最好的方法是什么? Rails模型中的字段?

时间:2012-04-06 22:02:50

标签: ruby-on-rails ruby-on-rails-3 model-view-controller model overloading

考虑模型用户:

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

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

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

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的每个引用。这听起来不太好。

1 个答案:

答案 0 :(得分:4)

我在ActiveRecord::Base documentation中看到,您可以覆盖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

更新:我已经尝试了它并且它可以正常工作但要注意,因为如果你没有明确地调用这个方法,你会得到数据库内容...例如你试图查询{{ 1}}表用于查找users用户,您可能会有惊喜。