2010-11-06 12 views
5

Tôi có một số truy vấn phức tạp (sử dụng truy vấn con, v.v.) và muốn dán chúng cùng với câu lệnh OR hoặc AND.Kết nối (keo) với các điều kiện bằng OR hoặc AND (Arel, Rails3)

Ví dụ:

where1=table.where(...) 
where2=table.where(...) 

Tôi muốn một cái gì đó giống như

where3=where1.or where2 

dụ Tiếp theo không làm việc cho tôi:

users.where(users[:name].eq('bob').or(users[:age].lt(25))) 

là vì tôi sẽ có một vài nơi (. .) truy vấn và tôi muốn ghép nối chúng.

Nói cách khác

Tôi có 3 phương pháp: đầu tiên trở lại đầu tiên ở đâu, thứ hai-thứ hai, thứ ba - HOẶC nối.

tôi phải có khả năng sử dụng tất cả 3 phương pháp trong ứng dụng của tôi và lưu DRY đang

Trả lời

2

Bạn đang tìm kiếm các hình thức:

users.where(users[:name].eq('bob').or(users[:age].lt(25))) 

tài liệu: https://github.com/rails/arel

+0

Tôi đã thêm câu trả lời cho câu hỏi chủ đề ... –

0

tôi biết rằng đối với VÀ ghép nối bạn có thể làm:

users = User.where(:name => 'jack') 
users = users.where(:job => 'developer') 

và bạn nhận được một nối với AND trong SQL (thử nó với #to_sql ở cuối)

Ngoài ra bạn có thể làm:

where1=table.where(...) 
where2=table.where(...) 
where1 & where2 

dụ:

(User.where(:name => 'jack') & User.where(:job => 'dev')).to_sql 
=> "SELECT `users`.* FROM `users` WHERE `users`.`name` = 'jack' AND `users`.`job` = 'dev'" 
1

người dùng .where (người dùng [: name] .eq ('bob') hoặc (người dùng [: age] .lt (25))) là gần, nhưng bạn cần phải lấy arel_table để chỉ định các cột, ví dụ

t = User.arel_table 
User.where(t[:name].eq('bob').or(t[:age].lt(25))) 
Các vấn đề liên quan