【问题标题】:has_many > through?has_many > 通过?
【发布时间】:2012-12-12 15:43:36
【问题描述】:

我的模型

class House
 has_many :taggings
 has_many :tags, through: :taggings
end


class Tag
 has_many :taggings
 has_many :houses, through: :taggings
end

路线:

scope "/:locale" do
resources :houses do
  collection do
    get 'tags/:tag', to: 'houses#index', as: :tag
end

房屋管理员:

if params[:tag]
      @houses = House.tagged_with(params[:tag])
      @tag = Tag.find_by_name(params[:tag])
  else

房屋索引视图

- @houses.each do |house|
 = raw house.tags.map(&:name).map { |t| link_to t, tag_houses_path(t), class: active_class?(tag_houses_path(t)) }.join

我想显示带有标签页面链接的标签。这很好用,但是当 2 个房屋被标记为相同的标记名(DB 中的 1 个)时,视图会显示 2 个相同的标记。 (例如房子 1 和 2 被标记为“家庭”,我在索引页面上看到 2 个家庭标签)我该如何解决这个问题?

谢谢..remco

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2


    【解决方案1】:

    您想要一组至少附加到一所房子的标签,对吧?

    Tag.joins(:taggings).select(“distinct(tags.id)”)
    

    【讨论】:

    • 当 1 个房子与标签“家庭”有关系时,标签显示 1 次,当 2 个不同的房子与家庭标签 > 2 个家庭标签时 - 当 3 个不同的房子与家庭标签时 >显示了 3 个家庭标签。所以在我的例子中,5 个房子被标记为“family”,5 个名为“family”的标签被显示,而不是一个家庭标签。这就是问题...remco
    【解决方案2】:

    不确定您希望您的视图看起来像什么,但以下语句将为您提供与视图/数组中所有房屋相关联的唯一标签集:

    @houses.collect {|h| h.tags.collect {|x| x.name}}.flatten.uniq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2011-11-19
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多