一个困难的named_scope情况

时间:2009-05-28 05:14:02

标签: ruby-on-rails named-scope

在我的应用程序中,用户可以启动并参与讨论。他们还可以标记讨论;当他们这样做时,会创建一个标签,其中包含标签的名称(如果它尚不存在),还有一个标签,它会记住哪个用户标记了哪个用什么标签进行了讨论。

所以在讨论模型中我们有这个:

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

我正在尝试创建一种简单的方法来从一个用户检索讨论中的所有标记。理想情况下,named_scopes将被明智地使用,以保持良好和干净。我认为它应该是这样的:

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

在Tag类中编写这个named_scope变得非常困难。它应该是什么样的?我是否需要以某种方式加入Taggings表?

3 个答案:

答案 0 :(得分:1)

您需要以某种方式将其与标记表连接。方法如下:

class Tag < AR::Base
  named_scope :from_user, lambda { |user| 
    { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
  }
end

答案 1 :(得分:0)

也许会这样做。虽然不是named_scope解决方案:

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

不确定您是否需要在此使用taggings.find_by_user_id(@user.id)。完成后,您将留下一个数组,其中包含给定用户给定讨论的标记。将该数组映射到taggings.tag-model(我猜你的标记模型属于一个标记)。

答案 2 :(得分:0)

我没有机会测试这个,但我认为它可能有效:

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)