【问题标题】:How to extend the functionality of an ActiveRecord object in Rails?如何在 Rails 中扩展 ActiveRecord 对象的功能?
【发布时间】:2011-07-28 22:30:54
【问题描述】:

我有一个名为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。

【问题讨论】:

  • 您可以将Parser 设为一个模块并将其包含在Story 类中,而不是继承。或者将Parser 添加为Story 的成员并将find_nouns 调用委托给它。
  • member of Story 是什么意思?
  • 像这样:class Storyattr_accessor :parserdef initialize@parser = Parser.new(content)enddelegate :find_nouns, :to =&gt; :parserend

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


【解决方案1】:

您的 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

【讨论】:

    【解决方案2】:

    看起来 ParserStory 不相关,parser 应该是它自己的类,并且应该具有接收 Story 的方法,或者只是纯字符串并解析它们以完成工作。

    Stories 不会从自身中“提取”名词,因此将 Parser 作为 Story 的子类实际上没有任何意义。

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

    【讨论】:

    • 我应该提到这不是我的实际问题,它只是一个足够简单的示例来演示我想要实现的目标。在技​​术层面上,我问的是实现我所要求的需要什么样的代码。谢谢你到目前为止的回答:)
    • 不明白你的意思,如果你想调用Story的方法,你为什么不把它放在那里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多