2012-05-19 14 views
9

Actualmente estoy usando Act_as_taggable_on para etiquetar y pg_search para buscar a través de mi base de datos postgresql en mi aplicación Rails 3.Rieles: ¿Cómo busco etiquetas generadas por Act_As_Taggable_On con PG_Search? (postgresql)

¿Cómo buscaría las etiquetas generadas por act_as_taggable_on gem con pg_search? Puedo ver las etiquetas de un mensaje diciendo "Post.find (1) .tag_list," pero no hay columnas "etiquetar" en el Cuadro de puestos, por lo que cuando corro el

pg_search_scope :search_by_weight, :against => {:tag_list => 'A', :title => 'B', :content => 'C'} #,:using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone] 

me da una error porque la columna Post.tag_list no existe en la tabla Publicar. ¿Cómo se llama cuando puede encontrar el valor a través del conector de puntos (por ejemplo, mission.tag_list) pero cuando no existe en la tabla? No sabía qué escribir. Entonces, básicamente, ¿cómo paso en una columna inexistente como params?

También, usted puede haber notado lo comenté a cabo la

:using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone] 

anteriormente. Parece que no puedo encontrar cómo instalar módulos adicionales para Postgresql. ¿Dónde escribo CREAR EXTENSIÓN? (usando ubuntu 11.10 y postgresql 9.1.3 -> y heroku para la producción)

+0

@muistooshort alguna idea sobre cómo resolver esto? – kibaekr

Respuesta

8

Un enfoque mucho más sencilla es sólo con la asociación y la búsqueda que a través de pg_search que se hace de esta manera:

class Item < ActiveRecord::Base 
include PgSearch 

    pg_search_scope :full_search, 
    :against => { 
    :item_status => 'A', 
    :title => 'B', 
    :description => 'C'  
    },  
    :associated_against => { 
    :tags => [:name]  
    } 
end 

simplemente he implementado esto en uno de mis proyectos y funcionó bien (búsqueda a través de los nombres de etiqueta) Lamentablemente, no puedo averiguar cómo ponderar una relación asociada, ya que dice que la columna "etiquetas" no se encuentra en la tabla de elementos.

+0

¡Gracias por la respuesta! Sí, de hecho lo entendí hasta este punto hasta ahora, pero también tuve el mismo problema al pesar las etiquetas. ¿Pudo obtener las funciones de búsqueda adicionales (es decir, trigram) para trabajar? (¿Estás usando Heroku?) – kibaekr

+0

Hola, no intenté agregar ninguna otra característica de búsqueda adicional, solo la de asociación. Estoy usando Heroku y, lamentablemente, la gema pg_search no funciona para mí en este momento, pero estoy trabajando en ello. Supuestamente, pg_search es fácil de usar con Heroku a diferencia de otros motores de búsqueda de texto completo, así que creo que será una solución fácil. Aún así, sería genial si las etiquetas se pueden ponderar o si las etiquetas se pueden hacer con una "coincidencia exacta" de lo contrario, ¿cuál es el propósito de las etiquetas? – user783437

+0

Ya veo. Sí, creo que tengo las características adicionales para trabajar a nivel local, pero no creo que funcione en Heroku en este momento. (Creo que puede deberse a que necesito actualizar o instalar los paquetes contrib en el servidor, pero heroku no me deja acceder a la actualización e instalación de la base de datos de pg) – kibaekr

1

Escribí mi implementación en plpgsql hace algunos años. Ver mi blog: http://omarqureshi.net/articles/2010-12-25-tsearch2-for-rails-applications que cubre cómo hacerlo funcionar.

+0

Hm ... como principiante, todavía es realmente confuso tratar de entender lo que está haciendo en su publicación de blog y aplicarlo a mi situación ... – kibaekr

+0

Comenzaría leyendo una guía sobre plpgsql y la documentación de activación para postgres –

+0

¡Esta es la solución! Muy bueno post Omar, aunque algunas funciones son un poco complicadas y las limpié un poco. Sin embargo, nunca lo habría hecho sin tu publicación en el blog. Yo te votaría por 10 puntos si pudiera :) ovaciones –

3

Esto funcionó para mí para conseguir las etiquetas ponderados, así

pg_search_scope :search_by_weight, 
     :against => { 
     :title => 'B', 
     :content => 'C'  
    },  
    :associated_against => { 
     :tags => { :name => 'A' }  
    }, 
    using: {tsearch: {dictionary: "english"}} 
Cuestiones relacionadas