2011-09-17 26 views
10

Có cách nào để đặt thuộc tính trong mongoid cho các tìm kiếm không phân biệt chữ hoa chữ thường không?Trường hợp không nhạy cảm khi tìm kiếm các từ trong mongoid

Cho phép nói rằng ai đó có tên người dùng: IAmGreat và tôi muốn tìm dữ liệu người dùng bằng tên người dùng duy nhất của họ mà không có tên người dùng và thay đổi nó thành iamgreat.

Cảm ơn

Trả lời

1

Tại sao không chỉ xuống một (hoặc bất kỳ sự kết hợp mô hình/thuộc tính của bạn) User.login.downcase khi đưa ra sự so sánh? Điều này sẽ để viết hoa trong DB như hiện tại, nhưng viết xuống trường chỉ để so sánh.

46

Thực ra bạn có thể tìm kiếm phân biệt chữ hoa chữ thường. Nhưng bạn phải tìm kiếm với một regex! Dưới đây là một ví dụ làm thế nào tôi đang sử dụng nó trong http://www.VersionEye.com

User.first(conditions: {email: /^#{email}$/i}) 

Với "/" bạn đang bắt đầu và kết thúc regex. Chữ "i" sau regex có nghĩa là không phân biệt chữ hoa chữ thường. "^" Có nghĩa là phần tử phải bắt đầu bằng chuỗi tìm kiếm và "$" có nghĩa là phần tử phải kết thúc bằng chuỗi tìm kiếm. Điều này là quan trọng nếu bạn đang tìm kiếm một kết hợp chính xác.

+10

FYI: bạn có thể cần phải khử trùng regex của bạn nếu nó bao gồm đầu vào của người dùng: '/^# {Regexp.escape (email)} $/i' – Andrew

+1

user = where (email: /^#{email}$/i).first – shilovk

5

Bạn thậm chí có thể thử một cái gì đó như:

User.where(username: /#{username}/i).first 
+0

(1) Điều đó không kiểm tra trường hợp- sự bình đẳng không nhạy cảm (2) Điều đó (AFAIK) sẽ không sử dụng chỉ mục để kiểm tra bộ sưu tập để nó có thể rất tốn kém. –

+0

Vâng. Điều này chậm hơn 50% so với truy vấn mặc định. Nhưng nó kiểm tra bình đẳng không phân biệt dạng chữ. – mrudult

+1

Không, nó không kiểm tra sự bình đẳng. Regex của bạn không có neo. –

2

nếu bạn đang sử dụng đường ray hoặc mongoid bạn có thể thử ff:

@user = User.where({:username => /.*#{name}.*/i })

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