如何在Rails中扩展ActiveRecord对象的功能?

时间:2011-07-28 22:30:55

标签: ruby-on-rails ruby ruby-on-rails-3 oop associations

我有一个名为Story的类,它与一个名为User的类相关联。 我还有一个名为Parser的类,它通过解析功能扩展了Story(例如找到名词)。

class User < ActiveRecord::Base
    has_many :stories
end

class Story < ActiveRecord::Base
    belongs_to :user
    attr_accessible :title, :content
end

class Parser < Story
    def find_nouns
        self.content.do_something
    end
end

说我想为我的数据库中的第一个用户创建一个新故事。通常情况下,我会使用

执行此操作
User.first.stories.new(:title => 'Foo', :content => 'Bar')

我如何实现这一目标,并且仍然优雅地将记录与第一个故事联系起来?

沿着这条线的东西:

User.first.stories.new(:title => 'Foo', :content => 'Bar').find_nouns

问题是,基类无法访问find_nouns方法 - 它属于StoryParser。

2 个答案:

答案 0 :(得分:3)

您的Parser类看起来应该是混合到Story类或实例中的模块,因为它是故事的一个方面。

http://en.wikipedia.org/wiki/Aspect-oriented_programming

这是模块:

module Parser
  def find_nouns
    ...
  end
end

将其与include

混合到课程中
class Story
  include Parser
end

或者将其混合到Story

的实例中
@user.stories.first.extend(Parser).find_nouns

答案 1 :(得分:0)

看起来 Parser Story 无关,解析器应该是它自己的类,并且应该有接收 Story 的方法或者只是纯粹的字符串并解析它们来完成它们的工作。

故事不会从自己“提取”名词,因此Parser成为故事的子类并不合理。

story = Story.new(:content => 'some content')
parser = Parser.new
parser.find_nouns( story.content ) # would generate ['content']