我有一个名为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。
答案 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']