Как я могу отобразить все теги от всех пользователей для экземпляра модели? - PullRequest
0 голосов
/ 01 сентября 2011

Я хочу получить все теги от всех пользователей в моем приложении для бренда с идентификатором 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 через brand_users
  • Пользователь has_many: brand_users и has_many:бренды,: through =>: brand_users
  • BrandUser принадлежит_to: бренд и принадлежит_то: пользователь

Ниже приведена моя схема:

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)

1 Ответ

1 голос
/ 01 сентября 2011

Просто выберите тег, где taggable_id - это brand_id, taggable_type - Brand, tagger_type - User и включает tag.

Tagging.where(:taggable_id => 37, :taggable_type => 'Brand', :tagger_type => 'User').include(:tag)
* 1010.* Чтобы сделать то же самое, но только для пользователей, которые связаны с брендом, и поле: 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)
...