在"操作文本"属性中搜索文本



>我有一个Post模型,这个模型使用ActionText作为属性content

has_rich_text :content

现在我有一个简单的搜索,我想在content中搜索文本,所以我有这样的东西:

@posts = Post.joins("INNER JOIN action_text_rich_texts ON action_text_rich_texts.record_id = posts.id").where("action_text_rich_texts.content LIKE ?", "%#{search_text}%")

但这给出了一个错误:

PG::UndefinedColumn: ERROR:  column action_text_rich_texts.content does not exist

在 ActionText 属性中搜索文本的正确方法是什么?

这是rails action_text:install生成的迁移:

# This migration comes from action_text (originally 20180528164100)
class CreateActionTextTables < ActiveRecord::Migration[6.0]
def change
create_table :action_text_rich_texts do |t|
t.string     :name, null: false
t.text       :body, size: :long
t.references :record, null: false, polymorphic: true, index: false
t.timestamps
t.index [ :record_type, :record_id, :name ], name: "index_action_text_rich_texts_uniqueness", unique: true
end
end
end

它告诉我们内容存储在action_text_rich_texts中,并且它使用多态关联链接到记录。

因此,您需要在连接中同时提供类型和 id,因为可以有多个行具有相同的 id,但用于不同的模型:

@posts = Post.joins("INNER JOIN action_text_rich_texts ON action_text_rich_texts.record_id = posts.id AND record_type = 'Post'")

您只需通过 设置关联,这样就不必手动加入:

class Post < ApplicationRecord
has_rich_text :content
# used to query the attached ActionText directly
has_one :action_text_rich_text,
class_name: 'ActionText::RichText',
as: :record
end

整个查询内容如下:

@posts = Post.joins(:action_text_rich_text)
.where("action_text_rich_texts.body LIKE ?", "%#{search_text}%")

谢谢,马克斯,我一直在使用 Ransack 为此苦苦挣扎。

所以我补充说:

has_one :action_text_rich_text, class_name:"动作文本::富文本", 如: :记录

然后在我的搜索字段中使用了_or_action_text_rich_text_body_,它就像一个魅力。

相关内容

  • 没有找到相关文章

最新更新