2012-05-19 51 views
9

Şu anda, Rails 3 uygulamasında postgresql veritabanım üzerinden arama yapmak için ve pg_search kullanıyorum.Raylar: PG_Search ile Act_As_Taggable_On tarafından oluşturulan etiketleri nasıl arayabilirim? (postgresql)

pg_search ile act_as_taggable_on gem tarafından oluşturulan etiketler arasında nasıl arama yapabilirim? Ben "Post.find (1) .tag_list" söyleyerek Post etiketleri görebilir ancak Mesaj tabloda hiç "etiket" sütunları vardır, bu yüzden

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

çalıştırdığınızda bana bir verir Post.tag_list sütunu Post tablosunda mevcut olmadığı için hata oluştu. Değeri nokta bağlayıcısı (yani, görev.tag_list) aracılığıyla bulduğunuzda, ancak tabloda bulunmadığında ne denir? Ne yazacağımı bilmiyordum. Temel olarak, var olmayan bir sütuna nasıl bir param olarak geçebilirim?

Ayrıca, yukarıda

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

dışarı yorumladı fark etmiş olabilirsiniz. Postgresql için ekstra modüllerin nasıl kurulacağını anlayamıyorum. CREATE EXTENSION yazmayı nerede yaparım? (ubuntu 11.10 ve postgresql 9.1.3 -> ve üretim için heroku)

+0

ağırlıklı olsun? – kibaekr

cevap

8

Çok daha basit bir yaklaşım sadece dernek kullanarak ve böyle yapılır pg_search yoluyla bu arama edilmiştir: o iyi çalıştı

class Item < ActiveRecord::Base 
include PgSearch 

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

Sadece benim projelerin birinde bu uygulamaya ve (etiket isimleri arandı). Maalesef, ilişkilendirilmiş bir ilişkinin, Öğeler tablosunda bulunmayan "etiketler" sütunu yazdığı için nasıl ağırlıklandırılacağını anlayamıyorum. Bu benim için çalıştı

+0

Cevabınız için teşekkürler! Evet, aslında şu ana kadar bu noktaya kadar düşündüm, ama aynı problemleri de tartıyorum. Çalışmak için ek arama özelliklerine (örn. Trigram) sahip miydiniz? (Heroku mu kullanıyorsun?) – kibaekr

+0

Merhaba, başka bir ek arama özelliği eklemeyi denemedim, sadece bir dernek. Ben Heroku kullanıyorum ve malesef pg_search gem şu anda benim için çalışmıyor ama üzerinde çalışıyorum. Sözde pg_search diğer tam metin arama motorlarının aksine Heroku ile kullanımı kolaydır, bu yüzden kolay bir düzeltme olacağını düşünüyorum. Etiketler ağırlıklandırılabiliyorsa veya etiketler bir "tam eşleme" ile yapılıyorsa yine de harika olurdu, aksi halde etiketlerin amacı nedir? – user783437

+0

Anladım. Evet, yerel olarak çalışmak için ekstra özelliklere sahip olduğumu düşünüyorum ama şu anda bunun Heroku üzerinde çalıştığını düşünmüyorum. (Bunun sebebi sunucudaki katkı paketlerini güncellemem veya yüklemem gerektiğidir, ancak heroku, pg veritabanının güncellenmesine ve yüklenmesine izin vermez) – kibaekr

1

Birkaç yıl önce plpgsql uygulamamı yazdım. Bloguma bakın: Nasıl çalıştığını gösteren http://omarqureshi.net/articles/2010-12-25-tsearch2-for-rails-applications.

+0

Hm ... acemi olarak, blog yayınınızda ne yaptığınızı anlamaya çalışmak ve bunu benim durumuma uygulamak gerçekten kafa karıştırıcıdır .. – kibaekr

+0

Ben plpgsql üzerinde bir kılavuz okuyarak başlayacağım. postgres. –

+0

Bu çözüm! Çok iyi mesaj Ömer, bazı işlevler biraz karmaşık olsa da onları biraz temizledim. Yine de, blog yazısı olmadan bunu asla yapmazdım. Eğer ben 10 puan kazanırdım eğer olsaydım :) cheers –

3

etiketler bunu çözmek konusunda herhangi bir fikri @muistooshort yanı

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