Как включить 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, к которому прикреплен форматированный текст.

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