2012-05-19 42 views
9

Tôi hiện đang sử dụng Act_as_taggable_on để gắn thẻ và pg_search để tìm kiếm thông qua cơ sở dữ liệu postgresql của tôi trên ứng dụng Rails 3 của tôi.Đường ray: Làm cách nào để tìm kiếm thẻ được tạo bởi Act_As_Taggable_On với PG_Search? (postgresql)

Tôi làm cách nào để tìm kiếm thông qua các thẻ được tạo bởi đá quý act_as_taggable_on với pg_search? Tôi có thể xem các thẻ của một bài viết bằng cách nói "Post.find (1) .tag_list," nhưng không có "tag" các cột trong bảng viết, vì vậy khi tôi chạy

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

nó mang lại cho tôi một lỗi vì cột Post.tag_list không tồn tại trong bảng Post. Nó được gọi là gì khi bạn có thể tìm thấy giá trị thông qua trình kết nối dấu chấm (ví dụ: mission.tag_list) nhưng khi nó không tồn tại trong bảng? Tôi không biết phải gõ gì. Vì vậy, về cơ bản, làm thế nào để vượt qua trong một cột không tồn tại như một params?

Ngoài ra, bạn có thể nhận thấy tôi nhận xét ra

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

trên. Tôi dường như không thể tìm cách cài đặt thêm mô-đun cho Postgresql. Tôi nên nhập TẠO TIỆN ÍCH ở đâu? (sử dụng ubuntu 11.10 và postgresql 9.1.3 -> và heroku để sản xuất)

+0

@muistooshort bất kỳ ý tưởng về cách giải quyết này? – kibaekr

Trả lời

8

Một đơn giản hơn nhiều cách tiếp cận chỉ được sử dụng hiệp hội và tìm kiếm thông qua pg_search đó được thực hiện như thế này:

class Item < ActiveRecord::Base 
include PgSearch 

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

tôi chỉ thực hiện điều này trong một trong những dự án của tôi và nó làm việc tốt (đã tìm kiếm thông qua tên thẻ). Thật không may tôi không thể tìm ra cách để trọng lượng một mối quan hệ liên quan vì nó nói cột "thẻ" không tìm thấy trong bảng Items.

+0

Cảm ơn bạn đã trả lời! Vâng, tôi thực sự đã tìm ra nó cho đến thời điểm này, nhưng tôi cũng gặp vấn đề với việc cân nhắc các thẻ. Bạn có thể nhận các tính năng tìm kiếm bổ sung (nghĩa là trigram) để hoạt động không? (Bạn đang sử dụng Heroku?) – kibaekr

+0

Xin chào, tôi đã không thử thêm bất kỳ tính năng tìm kiếm bổ sung nào khác, chỉ là liên kết. Tôi đang sử dụng Heroku và tiếc là đá quý pg_search không hoạt động cho tôi ngay bây giờ nhưng tôi đang nghiên cứu nó. Giả sử pg_search rất dễ sử dụng với Heroku không giống như một số công cụ tìm kiếm văn bản đầy đủ khác nên tôi nghĩ nó sẽ là một sửa chữa dễ dàng. Vẫn sẽ là tuyệt vời nếu các thẻ có thể được trọng số hoặc nếu thẻ có thể được thực hiện với một "khớp chính xác" nếu không thì mục đích của thẻ là gì? – user783437

+0

Tôi hiểu. Vâng, tôi nghĩ rằng tôi có các tính năng bổ sung để làm việc tại địa phương, nhưng tôi không nghĩ rằng nó hoạt động trên Heroku ngay bây giờ. (Tôi nghĩ rằng nó có thể là vì tôi cần phải cập nhật hoặc cài đặt các gói contrib trên máy chủ, nhưng heroku sẽ không cho phép tôi truy cập cập nhật và cài đặt cơ sở dữ liệu pg) – kibaekr

1

Tôi đã viết triển khai của mình trong plpgsql cách đây vài năm. Xem blog của tôi: http://omarqureshi.net/articles/2010-12-25-tsearch2-for-rails-applications bao gồm cách làm cho nó hoạt động.

+0

Hm ... với tư cách là người mới bắt đầu, nó vẫn còn thực sự khó hiểu để hiểu những gì bạn đang làm trong bài đăng trên blog của bạn và áp dụng nó vào tình huống của mình .. – kibaekr

+0

Tôi sẽ bắt đầu bằng cách đọc hướng dẫn về plpgsql và tài liệu kích hoạt postgres. –

+0

Đây là giải pháp! Rất tốt đăng Omar, mặc dù một số chức năng là một chút overcomplicated và tôi làm sạch chúng một chút. Tuy nhiên tôi sẽ không bao giờ thực hiện nó mà không có bài đăng trên blog của bạn. Tôi sẽ bầu bạn lên 10 điểm nếu tôi có thể :) chúc mừng –

3

này làm việc cho tôi để có được các thẻ trọng cũng

pg_search_scope :search_by_weight, 
     :against => { 
     :title => 'B', 
     :content => 'C'  
    },  
    :associated_against => { 
     :tags => { :name => 'A' }  
    }, 
    using: {tsearch: {dictionary: "english"}} 
Các vấn đề liên quan