Проблема построения отношений между моделями - PullRequest
0 голосов
/ 16 июня 2010

До сих пор я использовал плагин act_as_taggable_on для пометки объявлений.

Этот плагин создает следующие таблицы:

taggings: связывает таблицу тегов и объявлений (для помеченного элемента у него есть поле taggable_id, которое я переименую в "announce_id", что я объясню ниже).

теги: содержит идентификаторы и имена тегов.

На днях я обнаружил, что у меня нет возможности пометить объявления тегом определенного тега, но я делаю Announcement.tagged_with(tag_name), и я не хочу искать по имени, но по идентификатору.

Итак, поскольку я почти не использую функциональные возможности этого плагина, я решил создать модели для таблиц тегов и тегов, чтобы добиться этого: Announcement.tags.

Отношения моделей выглядят следующим образом:

EDIT:

class Tagging < ActiveRecord::Base
  belongs_to :announcement
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :announcements, :through => :taggings
end

class Announcement < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings

Почему я не могу выполнить команду Announcement.tags? Потому что, когда я пытаюсь, я получаю

неопределенный метод `tags '

Ответы [ 2 ]

1 голос
/ 16 июня 2010

вам следует попробовать @ announce.tags, так как теги - это метод экземпляра класса (модели) объявления.

@announcement = Announcement.first
1 голос
/ 16 июня 2010

Что вы на самом деле опубликовали, так это то, что вы пробовали Announcement.tags.Но tags будет методом для экземпляра Announcement, и он будет вызываться как метод класса Announcement, который не будет работать.

Предполагается, что вы действительно вызываете an_announce.tagsвам также нужно Announcement и Tag, чтобы иметь много taggings - например, так:

class Announcement < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :announcements, :through => :taggings
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...