Rails 4 + Sunspot: поиск вещей, которые "понравились" пользователю по их атрибутам (полиморфное has_many через ассоциации)

У меня есть что-то вроде следующего в приложении Rails 4:

class Like < ActiveRecord::Base
  belongs_to :liker, class_name: 'User'
  belongs_to :likeable, polymorphic: true
end

class Photo < ActiveRecord::Base
  # has a `title` and `description` attributes
  has_many :likes, as: likeable
  has_many :likers, through: :likes
end

class Song < ActiveRecord::Base
  # has a `title` and `description` attributes
  has_many :likes, as: likeable
  has_many :likers, through: :likes
end

class Video < ActiveRecord::Base
  # has a `title` and `description` attributes
  has_many :likes, as: likeable
  has_many :likers, through: :likes
end

class User < ActiveRecord::Base
  has_many :likes, source: :liker
  has_many :liked_photos, through: :likes, source: :likeable, source_type: 'Photo'
  has_many :liked_videos, through: :likes, source: :likeable, source_type: 'Video'
  has_many :liked_songs, through: :likes, source: :likeable, source_type: 'Song'
end

Я хотел бы иметь форму поиска, где текущий пользователь может искать фотографии, песни и видео по их title или же description но результаты могут быть оценены только теми, кто ему / ей понравился. Я читал некоторые другие посты, посвященные поиску has_many, но я запутался в полиморфной стороне вещей. Я думал, что поиск будет что-то вроде этого:

@search = Sunspot.search(Photo, Song, Video) { fulltext params[:term] }

Но потом я запутался, как оценить его с помощью current_user.likes. Или поиск должен быть на Like модель? Например:

@search = Like.search { fulltext params[:term] }

Что должно быть включено в searchable метод, и в какой модели (ях) это лучше всего принадлежит?

1 ответ

Вот что я в итоге сделал:

class Like < ActiveRecord::Base
  searchable do
    text :likeable_title do
      likeable.title
    end
    text :likeable_description do
      likeable.description
    end
    integer :liker_id
  end
end

Тогда я мог бы сделать следующий поиск в контроллере

@search = Like.search(include: :likeable) do
            fulltext params[:term]
            with :liker_id, current_user.id
          end

Затем я могу сделать вид, используя likeable за каждый результат. Дайте мне знать, если у вас есть лучший способ или есть что-то, что я не рассматриваю...

Другие вопросы по тегам