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
за каждый результат. Дайте мне знать, если у вас есть лучший способ или есть что-то, что я не рассматриваю...