代码之家  ›  专栏  ›  技术社区  ›  Raphomet

命名困难的情况

  •  1
  • Raphomet  · 技术社区  · 15 年前

    在我的应用程序中,用户可以开始并参与讨论。他们还可以标记讨论;当他们这样做时,会创建一个包含标记名称的标记(如果它还不存在的话),以及一个标记,它会记住哪个用户用什么标记了哪个讨论,也会被创建。

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

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

    我正在尝试创建一种简单的方法,从一个用户那里检索讨论中的所有标签。理想情况下,命名的_范围将被明智地用于保持物品的整洁。我觉得应该是这样的:

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

    在标记类中编写这个名为“作用域”的函数是非常困难的。它应该是什么样子?不知怎么的,我需要把它和标签桌连在一起吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Ian Terrell    15 年前

    你确实需要以某种方式将它与标签表连接起来。以下是如何:

    class Tag < AR::Base
      named_scope :from_user, lambda { |user| 
        { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
      }
    end
    
        2
  •  0
  •   Thorbjørn Hermansen    15 年前

    也许这样就行了。但没有命名的范围解决方案:

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

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

        3
  •  0
  •   John Topley    15 年前

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

    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)