Как добавить информацию о родительском экземпляре в отношение has_many?

Я использую плагин 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, но все они жалуются на неопределенный метод, поэтому есть что-то, чего я определенно не понимаю в области действия метода.


person Brian Kelly    schedule 08.07.2009    source источник


Ответы (1)


Я думаю, вы хотите использовать proxy_owner вместо self.

Попробуй это:

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

Я нашел хороший справочник по расширениям ассоциации здесь.

person Community    schedule 08.07.2009