0

我想从我的应用程序中的所有用户那里获取 ID 为 37 的品牌的所有标签。以下内容有效,但仅从应用程序中当前的 2 个用户之一获取标签:

<%= BrandUser.last.brand.tags.join(", ") %>

以下是我的尝试,但不起作用:

<%= BrandUser.where(:brand_id => 37).each {|brand| p brand.tags} %>
  • 品牌 has_many 标签、has_many brand_users 和 has_many users 通过 brand_users
  • 用户 has_many :brand_users 和 has_many :brands, :through => :brand_users
  • BrandUser belongs_to :brand 和 belongs_to :user

以下是我的架构:

ActiveRecord::Schema.define(:version => 20110824083919) do

  create_table "brand_users", :force => true do |t|
    t.integer  "brand_id"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "brands", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "user_id"
  end

  create_table "taggings", :force => true do |t|
    t.integer  "tag_id"
    t.integer  "taggable_id"
    t.string   "taggable_type"
    t.integer  "tagger_id"
    t.string   "tagger_type"
    t.string   "context"
    t.datetime "created_at"
  end

  add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
  add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"

  create_table "tags", :force => true do |t|
    t.string "name"
  end

  create_table "users", :force => true do |t|
    t.string   "provider"
    t.string   "uid"
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

解决方案

根据下面的答案,在控制台中运行以下命令给了我正在寻找的标签:

ActsAsTaggableOn::Tagging.where(:taggable_id => 37, :taggable_type => 'Brand', :tagger_type => 'User').includes(:tag)

但是运行以下命令也可以:

Brand.find(37).all_tags_on(:tags)
4

1 回答 1

1

只需选择 the taggable_idis the brand_id、 the taggable_typeis Brand、 the tagger_typeisUser和 include的标记tag

Tagging.where(:taggable_id => 37, :taggable_type => 'Brand', :tagger_type => 'User').include(:tag)

做同样的事情,但只针对与品牌关联的用户,以及 :tagger_id 字段:

Tagging.where(:taggable_id => 37, :taggable_type => 'Brand', :tagger_type => 'User', :tagger_id => User.where('brands.id' => 37).joins(:brands).select('users.id')).include(:tag)
于 2011-09-01T17:34:32.260 回答