0
同じ検索を使用してカテゴリ名検索用のhas_many(カテゴリ)テーブル内のレコードを検索すると、別の列からレコードを検索できる検索が実装されました。フィールド。OR検索条件付きの検索フィールドに基づいたレコードの検索方法
私が持っているこのようなモデル:
インフルエンサー:
has_many :influencer_categories, dependent: :destroy
has_many :categories, through: :influencer_categories
コードは次のとおりです。
コントローラー:
@influencers = Influencer.search(params)
モデル:
def self.search(params)
.includes(:categories)
.where(search_all(params[:q]))
.where("LOWER(categories.name) like '%#{params[:q].downcase}%'")
end
def self.search_all(criteria)
if criteria.include?('@') && criteria.start_with?('@')
criteria.split(' ').map {|criterion| "LOWER(username) like '%#{criterion.downcase.gsub('@', '')}%'"}.join(' OR ')
elsif criteria.include?('#') && criteria.start_with?('#')
criteria.split(' ').map {|criterion| "LOWER(bio) like '%#{criterion.downcase.gsub('#', '')}%'"}.join(' OR ')
else
"LOWER(full_name) like '%#{criteria.downcase}%' OR LOWER(username) like '%#{criteria.downcase}%' OR LOWER(bio) like '%#{criteria.downcase}%'"
end
end
が
出力誤差がある:
ActionView::Template::Error (PG::UndefinedTable: ERROR: missing FROM-clause
entry for table "categories"
LINE 1: ... '%food%' OR LOWER(bio) like '%food%') AND (LOWER(categories...
^
: SELECT COUNT(*) FROM "influencers" WHERE (LOWER(full_name) like '%food%' OR
LOWER(username) like '%food%' OR LOWER(bio) like '%food%') AND
(LOWER(categories.name) like '%food%')):
おそらく、私は食品カテゴリを持つすべてのインフルエンサー現れ、食品カテゴリの所望の結果を得るために、私の状態でORを含める必要があります。 私は何をする必要があります。
私はこのような何かがうまくいくと信じて:
SELECT "influencers"."id" FROM "influencers" LEFT OUTER JOIN
"influencer_categories" ON "influencer_categories"."influencer_id" =
"influencers"."id" LEFT OUTER JOIN "categories" ON "categories"."id" =
"influencer_categories"."category_id" WHERE (LOWER(full_name) like '%food%' OR
LOWER(username) like '%food%' OR LOWER(bio) like '%food%' OR
LOWER(categories.name) like '%food%')