2015-05-27 19 views
7

Tôi có một lớp Node mà tôi đã thiết lập acts_as_taggable bật, vì vậy tôi có thể thêm user_tags vào bất kỳ nút nào. Tôi cũng có một phương pháp trên mẫu Node của tôi sẽ tra cứu các bản ghi thực tế User cho tất cả người dùng trong số user_tag_list. Dưới đây là một ví dụ:Tôi làm cách nào để tìm kiếm thuộc tính ảo của đối tượng bằng pg_search?

[32] pry(main)> m = Node.find(85) 
    Node Load (8.6ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = $1 LIMIT 1 [["id", 85]] 
=> #<Node id: 85, name: "House Fire 2", family_tree_id: 57, user_id: 57, media_id: 228, media_type: "Video", created_at: "2015-05-15 00:20:26", updated_at: "2015-05-20 01:06:34"> 
[33] pry(main)> m.user_tags 
    ActsAsTaggableOn::Tag Load (3.8ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND "taggings"."context" = 'user_tags' [["taggable_id", 85], ["taggable_type", "Node"]] 
=> [#<ActsAsTaggableOn::Tag id: 4, name: "[email protected]", taggings_count: 1>, #<ActsAsTaggableOn::Tag id: 6, name: "[email protected]", taggings_count: 1>] 
[34] pry(main)> m.user_tag_list 
    ActsAsTaggableOn::Tag Load (0.8ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND (taggings.context = 'user_tags' AND taggings.tagger_id IS NULL) [["taggable_id", 85], ["taggable_type", "Node"]] 
=> ["[email protected]", "[email protected]"] 
[35] pry(main)> m.tagged_users 
    User Load (5.7ms) SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
    User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
=> [#<User id: 52, email: "[email protected]", encrypted_password: "$2a$10$KaX1kvtIw1.jGITnt9Czqeq3xTzhY3OM052NSHsL5Lf...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 5, current_sign_in_at: "2015-04-03 17:10:28", last_sign_in_at: "2015-04-03 00:38:24", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-03-05 01:36:31", updated_at: "2015-04-03 17:10:28", first_name: "Gerry ", confirmation_token: nil, confirmed_at: "2015-03-05 01:36:52", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "uncle", avatar: nil, invitation_token: nil, invitation_created_at: "2015-03-05 01:36:31", invitation_sent_at: "2015-03-05 01:36:31", invitation_accepted_at: "2015-03-05 01:36:52", invitation_limit: nil, invited_by_id: 1, invited_by_type: "User", invitations_count: 0, bio: nil, last_name: "Atrick", gender: 0>, 
#<User id: 58, email: "[email protected]", encrypted_password: "$2a$10$ZpzLH17iFrOXzH4U/pOX.e4nwN.9IJ1s1Ap/zQglk9K...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 6, current_sign_in_at: "2015-05-26 04:36:32", last_sign_in_at: "2015-04-03 00:14:55", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-03-12 03:39:28", updated_at: "2015-05-26 04:36:32", first_name: "Daniel", confirmation_token: nil, confirmed_at: "2015-03-12 05:46:18", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "son", avatar: nil, invitation_token: nil, invitation_created_at: "2015-03-12 03:39:28", invitation_sent_at: "2015-03-12 03:39:28", invitation_accepted_at: "2015-03-12 05:46:18", invitation_limit: nil, invited_by_id: 57, invited_by_type: "User", invitations_count: 0, bio: nil, last_name: "Marty", gender: 0>] 

Vì vậy, tốt nhất, những gì tôi muốn làm là cho phép người dùng tìm kiếm tiếng nói Gerry và nó sẽ trở Node.id = 85 từ ví dụ trên, vì Node.id = 85 có thẻ người dùng với tên gọi ban đầu Gerry.

Đây là của tôi hiện pg_search trên Node:

pg_search_scope :node_search, against: [:name, :user_id, :circa], 
    using: { tsearch: { any_word: true} }, 
    :associated_against => { 
     comments: [:message], 
     user: [:first_name, :last_name, :email], 
     memberships: [:relation] 
    } 

Tôi cảm thấy như tôi sẽ có thể sử dụng phạm vi năng động pg_search, nhưng tôi không thể khá grok nó.

Làm cách nào để đạt được điều này?

Trả lời

0

Nó chỉ ra rằng câu trả lời là khá thẳng về phía trước.

Cho rằng đây là lời tuyên bố của acts-as-taggable-on trong mô hình Node tôi:

acts_as_taggable_on :user_tags 

Giải pháp đơn giản là để thêm cột này trong tờ khai pg_search như vậy:

include PgSearch 
    pg_search_scope :node_search, against: [:name, :user_id, :circa], 
    using: { tsearch: { any_word: true, dictionary: :english} }, 
    :associated_against => { 
     comments: [:message], 
     user: [:first_name, :last_name, :email], 
     memberships: [:relation], 
     user_tags: [:name] 
    } 

Lưu ý rằng tôi đã có để chỉ định trường trong user_tags (tức là thuộc tính :name).

Vì vậy, bây giờ, nó tìm kiếm với thuộc tính ảo đó là :user_tags như tôi muốn.

Các vấn đề liên quan