Rails находит все посты с определенными тегами без использования act_as_taggable - PullRequest
1 голос
/ 03 марта 2011

Итак, я пытаюсь выучить рельсы и пока не хочу обманывать.

пост модель:

class Post < ActiveRecord::Base
    has_many :features
    has_many :tags, :through => :features
end

тегмодель:

class Tag < ActiveRecord::Base
    has_many :features
    has_many :posts, :through => :features
end

присоединиться к таблице:

class Feature < ActiveRecord::Base
    belongs_to :tag
    belongs_to :post
end

Я уже знаю, как связать сообщения с тегами, выполнив: Post.find_by_id(1) << Tag.first </strong>

Теперь я застрял в поиске сообщений с определенными тегами.Как найти все сообщения, имеющие один или несколько из следующих тегов: "плавание", "бег", "зарабатывание денег" .

В Post1 включены теги: "велосипед",«скалолазание», «плавание»

Post2 включает теги: «лягушки», «рыба»

Post3 включает теги: «зарабатывание денег», «плавание», «катание на велосипеде», «любовь»«

Post4 включает теги:« плавание »

Я хочу, чтобы сообщения, наиболее соответствующие интересам пользователя, отображались первыми.

пример: пользователь должен увидеть списокпосты в этом порядке .... post3, post1, post4.Если это слишком сложно, я думаю, достаточно будет найти все сообщения с точными тегами.

1 Ответ

0 голосов
/ 03 марта 2011

Вы просто должны быть в состоянии сделать

@tag.posts

Есть ли причина, по которой вы не использовали отношение has_and_belongs_to_many?

ОБНОВЛЕНИЕ:

За ваш комментарий:

tag_ids = [1, 2, 3] # aka the IDs for tags ["swimming", "running", "making money"]
matches = {}
@posts.each do |post|
  count = 0;
  post.tags.each do |tag|
    count += 1 if tag_ids.include? tag.id
  end
  matches[count] ||= []
  matches[count] << post
end

Возможно, можно немного оптимизировать, но matches будет включать все сообщения, соответствующие запрошенному тегу, в ключах в соответствии с номеромиз матчей.Это также, вероятно, следует использовать в методе класса для модели Posts вместо контроллера.

...