>我有一个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_,它就像一个魅力。