如何为属性方法提供更多功能?

时间:2014-03-04 12:09:26

标签: ruby-on-rails ruby methods ruby-on-rails-4 attributes

我正在使用Ruby on Rails 4,我想为属性方法提供更多功能。那就是:

鉴于我有以下模型类

class Article < ActiveRecord::Base
  ...
end

给定Article个实例具有以下属性方法

@article.title   # => "Sample title"
@article.content # => "Sample content"

然后我想添加Article功能,如下所示:

class Article < ActiveRecord::Base
  def title(args)
    # Some logic...

    self.title
  end

  def content(args)
    # Some logic...

    self.content
  end
end

@article.title(args)
@article.content(args)

上述方法是安全/正确/有效吗?我会有问题吗?

2 个答案:

答案 0 :(得分:1)

您正在覆盖titlecontent方法,据我所知,此方法根本不安全。比如,拥有getter和setter方法是一个完全不同的故事。但是,这种模式会在一段时间后让您和其他开发人员感到困惑。

如果我是对的(请纠正我,如果我错了,请),你必须得到 wrong number of arguments (0 for 1)title在您所拥有的行号处出现content错误:

当你这样做时,

self.titleself.content

@article.title(args)
@article.content(args)

答案 1 :(得分:0)

我建议您阅读7 Patterns to Refactor Fat ActiveRecord Models。你想要的可以是一个很好的装饰者或价值对象。

class Title
  def initialize(article)
    @article = article
  end

  def weird_title
    some_logic
  end
end

当文章weird_title

需要article_1
Title(article_1).weird_title

因此,您可以获得良好的代码分离(OOP样式)并保持模型清洁。