Как вытащить записи из модели на основе их связанных данных? (Rails) - PullRequest
1 голос
/ 08 января 2012

Предположим, у меня есть модель обсуждения, и обсуждение может быть помечено. Эти теги связаны с обсуждением через таблицу тегов.

Я хочу определить метод .tagged_with (tag), который в основном будет делать:

 def tagged_with

      Discussion.where(#something about tags include the tag given)
 end

У меня есть некоторые методы, которые могут быть полезны, уже настроены. Например, у меня есть tag_list

 def tag_list
     tags.map(&:name).joins(", ") #my tags are separated by commas, not spaces)
 end

И если кто-то знает ответ на более простой вопрос обрезки модели обсуждения, основанной на одном теге, как я могу расширить ее, чтобы она была более адаптируемой - например, принимая аргумент из нескольких тегов и имея возможность указать, что любой или все нужно. EG:

 Discussion.tagged_with(tag1, tag2, :any => true)

К вашему сведению код из ассоциаций:

has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings, :source => :tag, :source_type => "Tag"

1 Ответ

1 голос
/ 08 января 2012

Вы должны иметь возможность присоединить таблицу тегов к вашему запросу на обсуждение через его отношение has_many. Discussion.joins(:tags).where(:tags => {:name => array_of_tags}).

С приведенным ниже определением метода вы можете сделать что-то вроде Discussion.tagged_with(['foo', 'bar']) или Discussion.tagged_with('foo').

def self.tagged_with(tag_or_tags)
  joins(:tags).where(:tags => {:name => tag_or_tags})
end
...