PG_SEARCH USSEMPS Associated_against donne une erreur "Colonne [Model_Name]. [Associated_Column_name] n'existe pas"

StackOverflow https://stackoverflow.com/questions/19855477

Question

J'essaie d'utiliser PG_Search pour rechercher un modèle associé. Lorsque j'exécute une recherche, j'obtiens l'erreur "PG :: ERROR: ERREUR: Colonne Plans.Name n'existe pas". J'exécute la recherche dans le modèle "Plans" et j'essaie de rechercher contre l'association de la "place" avec une colonne "nom". Le Has_Many: via le modèle qui les connecte est polymorphe. D'une manière ou d'une autre, la requête SQL combine les deux et lance une erreur. J'ai exécuté la migration associée_against (Rails G PG_Search: Migration: Associated_against), parcouru la documentation, et recherché d'autres avec l'erreur et trouver rien, il doit être que je néglige simplement quelque chose. Il s'exécute correctement (sans les résultats de recherche plus étendus) si je supprime simplement la ligne associée_against dans plan.rb. Toute aide serait appréciée!

Plan.rb:

class Plan < ActiveRecord::Base
    belongs_to :user
    has_many :plan_places, :dependent => :destroy
    has_many :places, through: :plan_places, source: :plan

    include PgSearch
    pg_search_scope :search, :against => [:title, :summary],
        associated_against: { places: [:name, :address]},
        using: {tsearch: {dictionary: "english"}},
        ignoring: :accents

    def self.text_query(query)
        if query.present?
          search(query)
        else
          scoped
        end
    end
end

Place.rb:

class Place < ActiveRecord::Base
    has_many :plan_places, as: :sortable #polymorphic -- could this be the issue??
    has_many :plans, through: :plan_places

   include PgSearch
        multisearchable :against => [:name, :address]
        pg_search_scope :search, against: [:name, :address],
            using: {tsearch: {dictionary: "english"}},
            ignoring: :accents
    def self.text_query(query)
            if query.present?
              search(query)
            else
              scoped
            end
    end
end

Manette:

def index
    query = params[:query]
    @plans = Plan.text_query(query)
  end

Message d'erreur complet:

PG::Error: ERROR:  column plans.name does not exist
LINE 1: ...OUTER JOIN (SELECT "plans"."id" AS id, string_agg("plans"."n...
                                                             ^
: SELECT "plans".*, ((ts_rank((to_tsvector('english', unaccent(coalesce("plans"."title"::text, ''))) || to_tsvector('english', unaccent(coalesce("plans"."summary"::text, ''))) || to_tsvector('english', unaccent(coalesce(pg_search_ef8b0c36567cc241900c73.pg_search_1d546fcf34c118d2a7b8f6::text, ''))) || to_tsvector('english', unaccent(coalesce(pg_search_ef8b0c36567cc241900c73.pg_search_f3147101e01c522d780049::text, '')))), (to_tsquery('english', ''' ' || unaccent('giraffe') || ' ''')), 0))) AS pg_search_rank FROM "plans" LEFT OUTER JOIN (SELECT "plans"."id" AS id, string_agg("plans"."name"::text, ' ') AS pg_search_1d546fcf34c118d2a7b8f6, string_agg("plans"."address"::text, ' ') AS pg_search_f3147101e01c522d780049 FROM "plans" INNER JOIN "plan_places" ON "plan_places"."plan_id" = "plans"."id" INNER JOIN "plans" "places_plans" ON "places_plans"."id" = "plan_places"."plan_id" GROUP BY "plans"."id") pg_search_ef8b0c36567cc241900c73 ON pg_search_ef8b0c36567cc241900c73.id = "plans"."id" WHERE (((to_tsvector('english', unaccent(coalesce("plans"."title"::text, ''))) || to_tsvector('english', unaccent(coalesce("plans"."summary"::text, ''))) || to_tsvector('english', unaccent(coalesce(pg_search_ef8b0c36567cc241900c73.pg_search_1d546fcf34c118d2a7b8f6::text, ''))) || to_tsvector('english', unaccent(coalesce(pg_search_ef8b0c36567cc241900c73.pg_search_f3147101e01c522d780049::text, '')))) @@ (to_tsquery('english', ''' ' || unaccent('giraffe') || ' '''))))  ORDER BY pg_search_rank DESC, "plans"."id" ASC, created_at DESC
Était-ce utile?

La solution

J'ai fini par utiliser une solution de contournement quelque peu hacky si quelqu'un d'autre en fait l'expérience. Dans la méthode de recherche du modèle Plan, je fais juste l'exécution de la recherche sur le modèle enfant (lieux), obtiennent les plans associés des résultats en utilisant le Has_Many: via la table (Plan_Places) et ajoutez cette liste aux résultats de recherche du plan régulier. C'est moche et probablement très inefficace, donc si quelqu'un connaît une "vraie" réponse, veuillez soumettre!

def self.text_query(query)
    if query.present?
      place_ids = Place.text_query(query).map(&:id).uniq
      plan_ids = PlanPlace.where(sortable_id: place_ids, sortable_type: "Place").map(&:plan_id).uniq
      plans = find(plan_ids)
      plans = plans + search(query)
    else
      scoped
    end
  end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top