Acts-as-taggable-on найти все теги по контексту - PullRequest
16 голосов
/ 04 января 2011

Поэтому после поиска драгоценного камня для моего приложения rails я обнаружил удивительный драгоценный камень actions-as-taggable .Установив его и поиграв в него, я обнаружил, что он хранит все теги внутри тега db, который просто хранит имя Tag.name без контекста, вместо этого контекст содержится в отношении: through db (тегирование).Для большинства целей я вижу, что это идеально.За исключением моего приложения, я хочу иметь возможность предлагать пользователю возможность пометить тегами на основе ранее существующих тегов (например, не разрешать им создавать свои собственные), а действует как теги не имеетвозможность поиска по всем тегам в пределах одного встроенного контекста (например, если бы я представлял автозаполнение тега db, в мое приложение были бы включены все теги, что не то, что я хочу)

Метод, приведенный ниже, - это то, что я только что уточнил, чтобы посмотреть, сработает ли это (что оно делает), но мне было интересно, если я что-то упустил с cts-as-taggable .Я имею в виду, что нигде не могу найти такой метод?

<% ActsAsTaggableOn::Tagging.find_all_by_context("tags").each do |tagging| %>
  <%= tagging.tag %>
<% end %>

Если, например, действует как тег не делает этого, это лучший способ сделатьэтот?Это выглядит немного неэффективно, лучше бы я делал собственный SQL-запрос вместо маршрутизации через actions-as-taggable ?

Если это вообще поможет, вот хвост моего журнала:

Started GET "/users" for 127.0.0.1 at 2011-01-04 14:46:20 +0000
Processing by UsersController#index as HTML
SQL (0.5ms)   SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
User Load (0.1ms)  SELECT "users".* FROM "users"
ActsAsTaggableOn::Tagging Load (0.5ms)  SELECT "taggings".* FROM "taggings" WHERE ("taggings"."context" = 'languages')
ActsAsTaggableOn::Tag Load (0.1ms)  SELECT "tags".* FROM "tags" WHERE ("tags"."id" = 2) LIMIT 1
Rendered users/index.html.erb within layouts/application (10.4ms)

Ответы [ 2 ]

16 голосов
/ 01 февраля 2011

Вы также можете использовать оператор, подобный следующему:

# Returns all the tags for the specified model/context with a count >= 1
@tags = YourModel.tag_counts_on(**context**)

Добавить лимит и порядок:

# Get the top 5 tags by count
@tags = YourModel.tag_counts_on(**context**, :limit => 5, :order => "count desc")

Доступ к счетам с атрибутом count тегов, возвращаемых изtag_counts_on

tag.count
0 голосов
/ 24 марта 2014

Я считаю, что есть способ: User.tag_counts_on(:tags)

=> [#<ActsAsTaggableOn::Tag id: 1, name: "foo">,
#<ActsAsTaggableOn::Tag id: 2, name: "bar">,
#<ActsAsTaggableOn::Tag id: 3, name: "sushi">,
#<ActsAsTaggableOn::Tag id: 4, name: "pizza">]
...