2011-12-15 30 views
21

Tôi đang cố gắng tìm tất cả tài liệu có văn bản chứa kiểm tra từ. Bên dưới hoạt động tốt:Sử dụng LIKE/regex với biến trong mongoid

@tweets = Tweet.any_of({ :text => /.*test.*/ }) 

Tuy nhiên, tôi muốn tìm kiếm chuỗi do người dùng cung cấp. Tôi nghĩ rằng dưới đây sẽ làm việc nhưng nó không:

searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => "/.*"+searchterm+".*/" }) 

Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến, bất cứ ai biết những gì tôi có thể làm để thực hiện công việc này.

Xin cảm ơn trước.

+0

Tôi nghĩ bạn nên thêm "i" ở cuối có /.*test.*/i để làm cho công việc đó mà không bị phân biệt chữ hoa. –

Trả lời

22
searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") }) 

hoặc

searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => /.*#{searchterm}.*/ }) 
+0

Tôi cần làm gì nếu tôi muốn tìm kiếm như có vị trí Mumbai và tôi đang đi qua các địa điểm như Mumbai, Maharashtra, Ấn Độ.Nhưng nó không phải là tìm kiếm .. đây là truy vấn của tôi Event.any_of (vị trí: /.*mumbai maharashtra. */is) .entries.Nó không hoạt động nhưng nếu Tôi vượt qua một mumbai sau đó làm việc của nó.Xin vui lòng đề nghị –

+0

Điều này làm việc cho tôi – fmquaglia

15

Không có gì sai với truy vấn regex mongodb. Vấn đề là chuyển biến sang chuỗi regex ruby. Bạn không thể trộn lẫn chuỗi với regex như chuỗi bình thường

Thay vào đó

"/.*"+searchterm+".*/" 

thử này

>>searchterm = "test" 
    >>"/#{searchterm}/" 
    >> "/test/" 
+4

Cảm ơn một nhóm, Ramesh. Tôi đã phải loại bỏ "lúc bắt đầu và kết thúc và sau đó ví dụ của bạn làm việc hoàn hảo. Tuyệt vời! – Hinchy

+0

vui vì nó đã giúp :) – RameshVel

+0

Không phải là nó dễ bị tấn công mã độc? – Aleksey

0

này làm việc cho tôi bằng cách thực hiện:

Model.find(:all, :conditions => {:field => /regex/i}) 
0
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") }) 

là công việc, nhưng không có kết quả

@tweets = Tweet.any_of({ :text => Regexp.new (".*"+searchterm+".*") }) 

là ok và có kết quả

@tweets = Tweet.any_of({ :text => /.*#{searchterm}.*/ }) 

là công việc, không có kết quả

Phiên bản mông cổ của tôi là phiên bản 3.1.3 và ruby ​​là 1 .9.3

1
@tweets = Tweet.any_of({ :text => Regexp.new (".*"+searchterm+".*") }) 

là ok và có kết quả

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