Postモデルでアクションテキストリッチテキストを使用する場合、Rails 7でRansackを使用して検索するにはどうすればよいですか?

概要

誰かがなぜ機能しないのかを理解するのを手伝ってくれますか? それで、話は何ですか:ランサックバージョン4.1.1を備えたRails 7(7.1.3)ブログアプリがあります

検索フォームでは、投稿タイトルと投稿本文でテキストを検索する必要があります そしてこのエラーが発生します

paramsでこれを見ることができます

title_cont のようなタイトルのみで検索しようとしている場合はすべて問題ありませんが、body_cont または title_or_body_cont で検索すると前述のエラーが発生します。これは、Post モデルに body フィールドがなく、このフィールドが action_text_rich_texts テーブルにあるためだと思います。そして、Post モデルの action_text_rich_texts テーブルに関連付けを追加した後も、前述のエラーが依然として発生します。よろしくお願いいたします。

そして私のコード

class Post < ApplicationRecord
  has_rich_text :body
  has_many :comments, dependent: :destroy
  belongs_to :user
  has_one_attached :post_image

  validates :title, presence: { message: 'must be given please' }, length: { minimum: 5 }
  validates :body, presence: true, length: { minimum: 10 }
  validate :post_body_length
  validate :acceptable_image

  def self.ransackable_attributes(_auth_object = nil)
    %w[title body created_at updated_at user_id]
  end

  def self.ransackable_associations(_auth_object = nil)
    %w[users action_text_rich_texts]
  end

  private

  def acceptable_image
    return unless post_image.attached?

    errors.add(:post_image, 'is too big') unless post_image.blob.byte_size <= 5.megabyte

    acceptable_types = ['image/jpeg', 'image/png']
    return if acceptable_types.include?(post_image.content_type)

    errors.add(:post_image, 'must be a JPEG or PNG')
  end

  def post_body_cant_be_empty
    if self.body.blank?
      self.errors.add(:body, "can't be empty")
    end
  end

  def post_body_length
    if self.body.to_plain_text.length < 10
      self.errors.add(:body, 'is too short (minimum is 10 characters)')
    end
  end
end

また、searchs_controllerもあります

class SearchesController < ApplicationController
  def index
    @query = Post.ransack(params[:q])
    @posts = @query.result.includes(:rich_text_body)
  end
end

そしてsearch_form

<%= search_form_for @query, url: searches_path, method: :get, html: { class: "d-flex", role: "search" } do |f| %>
  <%= f.search_field :title_or_body_cont, class: "form-control me-2", placeholder: "Search title or body..." %>
  <%= f.submit "Search", class: "btn btn-outline-secondary-light btn-sm" %>
<% end %>

とルート

resources :searches, only: %i[index]

ポストテーブルの構造

 create_table "posts", force: :cascade do |t|
    t.string "title", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id", null: false
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

Action_text_rich_texts テーブル構造

create_table "action_text_rich_texts", force: :cascade do |t|
    t.string "name", null: false
    t.text "body"
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
  end

解決策

ご提案いただきありがとうございます。それは動作します。

Post モデルの関連付け rich_text_body をメソッドに追加します self.ransackable_associations

def self.ransackable_associations(_auth_object = nil)
   %w[users rich_text_body]
end

そして、検索フォーム search_field で検索する場所を修正します

title_or_rich_text_body_body_cont

この調整を行った後は、すべてが正しく機能するようになりました。

この提案に従ってランサック初期化子を追加する必要もあります 4.0.0 と ActionText::RichText へのアップグレードを捜索する

class ActionText::Record < ActiveRecord::Base
  def self.ransackable_attributes(auth_object = nil)
    authorizable_ransackable_attributes
  end
end