Как включить Pgsearch в текст действия в Rails
Я добавляю pgsearch в Rails 6 Action Text и не уверен, что это лучший метод для включения pgsearch в модель RichText. Кажется, я не могу исправить модель, не сломав ее. У меня это работает, полностью заменяя модель, но, очевидно, я не хочу оставлять это таким образом. Есть идеи, как сделать эту работу? Вот моя текущая модель:
include PgSearch
class ActionText::RichText < ActiveRecord::Base
self.table_name = "action_text_rich_texts"
multisearchable :against => :body
serialize :body, ActionText::Content
delegate :to_s, :nil?, to: :body
belongs_to :record, polymorphic: true, touch: true
has_many_attached :embeds
before_save do
self.embeds = body.attachments.map(&:attachable) if body.present?
end
def to_plain_text
body&.to_plain_text.to_s
end
delegate :blank?, :empty?, :present?, to: :to_plain_text
end
3 ответа
Я решил головоломку ActionText+PgSearch, используя related_against, не совсем то, что вы просите, но, возможно, он полезен для вашей проблемы.
class Article < ApplicationRecord
include PgSearch
has_rich_text :content
pg_search_scope :search, associated_against: {
rich_text_content: [:body]
}
end
Всего наилучшего!
Ответ от @dirk-sierd-de-vries был для меня не сразу очевиден. Итак, я собираюсь добавить пример для моего обучения и использования в будущем.
class Book < ApplicationRecord
include PgSearch
has_rich_text :chapter
pg_search_scope :book_search, associated_against: {
rich_text_chapter: [:body]
}
end
Когда вы ищете book.chapter
в командной строке вы получите следующее:
#<ActionText::RichText id: 1, name: "chapter", body: #<ActionText::Content "<div class=\"trix-conte...">, record_type: "Book", record_id: 1, created_at: "2019-12-31 00:00:00", updated_at: "2019-12-31 00:00:00">
Следовательно, associated_against должен быть body
.
Если вы хотите сделать поля ActionText::RichText доступными для множественного поиска, вы можете (заимствуя из этого руководства ) добавить инициализатор в
config/initializers/action_text_rich_text.rb
:
ActiveSupport.on_load :action_text_rich_text do
include PgSearch::Model
multisearchable against: :body
end
Таким образом можно «безопасно» обезьяньим патчить.
Обратите внимание, что если
PgSearch.multisearch("YOUR QUERY").first.searchable.is_a?(ActionText::RichText)
, тебе нужно будет позвонить
.record
на нем, чтобы получить доступ к фактическому объекту ActiveRecord, к которому прикреплен форматированный текст.