Создание ленты с помощью plays_as_taggable_on в Rails

Я пытаюсь создать канал в Rails, используя acts_as_taggable_on, и у меня возникают небольшие проблемы.

В моем приложении есть пользователи, которые принадлежат к группам, и каждый пользователь выбирает для себя несколько тегов, используя контекст plays_as_taggable_on :user_tags. Пользователи создают сообщения, которые также имеют теги, но имеют контекст :post_tags.

Я пытаюсь создать канал для текущего пользователя, состоящий из сообщений из его / ее группы, которые имеют по крайней мере один :post_tag общий с :user_tags текущего пользователя. Так, например, если у меня есть пользователь, который выбирает «Разработчик, Дизайнер» как два :user_tags, я бы хотел вернуть все сообщения из его / ее Группы, в которых «Разработчик» и / или «Дизайнер» указаны как :post_tags.

После нескольких часов возни вот что я пробовал в post.rb, но это дало мне ошибку («ОШИБКА: столбец 'tag_id' не существует LINE 1»), что кажется странным, учитывая, что tag_ids существуют для тегов.

# Returns posts with tags also attributed to the given user.
  def self.from_posts_matching_tags_of(user)
    matching_tag_ids = "SELECT tag_id FROM taggings
                        WHERE  taggable_id = :user_id"
    where("tag_id IN (#{matching_tag_ids}) OR user_id = :user_id", user_id: user)
  end 

Мы будем очень благодарны за любые предложения о том, как правильно создать такой метод подачи. И если есть какой-либо другой соответствующий код, которым вы хотите, чтобы я поделился, просто дайте мне знать.


person Andrew    schedule 08.01.2015    source источник


Ответы (1)


Итак, я нашел решение, которое до сих пор работало в моем (правда, ограниченном) тестировании. Надеюсь, это поможет всем, кто хочет сделать что-то подобное. Конечно, если кто-нибудь знает более эффективный способ решения этой проблемы, я всегда открыт для улучшений.

Я добавил это в pages_controller.rb, и, похоже, это помогает:

def index
  if logged_in?
    @feed_items = Post.tagged_with([@current_user.user_tag_list], :on => :post_tags, :any => true)
  end
end

А это на index.html.erb:

<% if @feed_items.any? %>
    <% @feed_items.each do |post| %>
        <%= link_to post.content, post %><br/>
    <% end %>
<% end %>
person Andrew    schedule 08.01.2015