Сложная ситуация named_scope - PullRequest
1 голос
/ 28 мая 2009

В моем приложении пользователи могут запускать и участвовать в обсуждениях. Они также могут отмечать обсуждения; когда они это делают, создается тег, содержащий имя тега (если он еще не существует) и тег, который запоминает, какой пользователь пометил, какое обсуждение с каким тегом, тоже создается.

Итак, внутри модели обсуждения мы имеем это:

has_many :taggings
has_many :tags, :through => :taggings

Я пытаюсь создать простой способ получения всех тегов в обсуждении от одного пользователя. В идеале named_scopes должен использоваться разумно, чтобы все было красиво и чисто. Я думаю, это должно выглядеть примерно так:

tags = @discussion.tags.from_user(@user)

Запись этого named_scope внутри класса Tag оказывается очень сложной. Как это должно выглядеть? Нужно ли как-то объединить его с таблицей тегов?

Ответы [ 3 ]

1 голос
/ 28 мая 2009

Вам нужно каким-то образом присоединиться к таблице тегов. Вот как это сделать:

class Tag < AR::Base
  named_scope :from_user, lambda { |user| 
    { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
  }
end
0 голосов
/ 28 мая 2009

У меня не было возможности проверить это, но я думаю, что это может сработать:

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

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

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

  named_scope :by_user do
    def named(user) do
      Tagging.find_by_user_and_discussion(user, discussion).tags
    end 
  end
end

Используйте это так:

tags = @discussion.tags.by_user.named(@user)
0 голосов
/ 28 мая 2009

Может быть, это сделает это. Решение не named_scope, хотя:

tags = @discussion.taggings.find_by_user(@user).map(&:tag)

Не уверен, если вам нужно использовать taggings.find_by_user_id(@user.id) здесь. Когда это будет сделано, у вас останется массив, который содержит теги для данного обсуждения данного пользователя. Сопоставьте этот массив с taggings.tag-model (я думаю, ваша модель тегирования принадлежит тегу).

...