Я использую плагин acts as tagable on steroids, и мое веб-приложение имеет 4 модели:
- Категория
- Entry - acts as taggable and contains the following using single table inheritance
- Story
- Тема
Категория имеет два важных поля:
- tags:string - список тегов, связанных с этой категорией
- primary_tag:string — единый тег, который назначается любым темам, созданным для категории.
На сайте есть следующие две страницы:
- На странице «Истории» для категории перечислены все истории, отмеченные тегами этой категории.
- На странице тем для категории перечислены все темы и истории, отмеченные тегами этой категории.
Создание Историй и Тем происходит следующим образом:
- Когда редактор создает историю, он предоставляет список тегов, которыми можно пометить историю.
- Когда пользователь создает тему, она создается в контексте категории. При создании он автоматически помечается тегом primary_tag категории.
Я пытаюсь определить 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.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, но все они жалуются на неопределенный метод, поэтому есть что-то, чего я определенно не понимаю в области действия метода.