如何将父实例特定信息添加到has_many关系?

时间:2009-07-08 02:53:34

标签: ruby-on-rails activerecord tags polymorphism

我使用充当类固醇插件的标签,我的网络应用程序有4个模型:

  • 分类
  • Entry - 充当可标记的,并使用单表继承包含以下内容
    • 故事
    • 主题

类别有两个重要的领域:

  • tags:string - 与此类别相关联的标签列表
  • primary_tag:string - 分配给为类别
  • 创建的任何主题的单个标记

在网站上有以下两页:

  • 类别的故事页面列出了标有该类别标签的所有故事。
  • 类别的主题页面列出了标有该类别标签的所有主题和故事。

故事和主题的创建如下:

  • 当编辑创建一个故事时,他们会提供一个标记列表来标记故事。
  • 当用户创建主题时,它是在类别的上下文中创建的。它在创建时使用类别的primary_tag自动标记。

我正在尝试为Category定义3个has_many关系,它使用标签来查找关联的条目,故事和主题。如果我在控制器代码中执行此操作,我将使用以下内容:

@category = Category.find(1)
@entries = Entry.find_tagged_with(@category.tags) # All Entries
@entries = Story.find_tagged_with(@category.tags) # Just Stories
@entries = Topic.find_tagged_with(@category.tags) # Just Topics

我想将它设为Category的实例方法,以便我将其调用如下:

@category.find(1)
@entries = @category.entries # All Entries
@entries = @category.stories # Just Stories
@entries = @category.topics  # Just Topics

我无法弄清楚如何在/ has_many声明中指定/指定上面的类方法来使用相关类别实例进行工作。

我试过这个:

has_many :entries do
  def tagged
    Entry.find_tagged_with(self.tags)
  end
end

但最终出现以下错误:

>> @category = Category.find(2)
=> #<Category id: 2, title: "Comics", description: "Comics", enabled: true, tags: "comics", created_at: "2009-06-22 13:29:52", updated_at: "2009-07-01 13:44:09", parent_id: nil, image: "", important: true, stories_enabled: true, topics_enabled: true, primary_tag: "comics">
>> @category.entries.tagged
NoMethodError: undefined method `tags' for #<Class:0x22781dc>

我已经尝试过this.tags和reflection.tags但是他们都抱怨一个未定义的方法,所以我肯定不明白这个方法的范围。

1 个答案:

答案 0 :(得分:1)

我认为你想使用 proxy_owner 而不是 self

试试这个:

has_many :entries do
  def tagged
    Entry.find_tagged_with(proxy_owner.tags)
  end
end

我在Association Extensions here上找到了一个很好的参考。