2012-02-15 55 views
0

我正在创建在轨道上的下面的Ruby 3查询:如何使用轨道的ActiveRecord编写一个查询有3个条件

User.rb

search_results = self.find(:all, 
        :select => 'id,fb_id,fname,lname,org_id', 
        :conditions => ["guest = ? AND fb_id != ? AND trim(lower(fname)) || ' ' || trim(lower(lname)) LIKE ?", false, nil, '%'+"#{q.downcase}"+'%'], 
        :limit => 8 
) 

条件是:

  1. 用户需要为guest = false或者fb_id不为空
  2. 如果1为true,则根据user.fname和user.lname查找

这没有任何返回。我猜我正在搞乱#1。有关条件有什么问题或处理此查询的更好方法的任何建议?谢谢

回答

1

检查日志以准确查看对数据库的查询。确保数据库中确实存在您认为存在的记录。

如果请求User needs to be either guest == false or have a fb_id that's not null那么查询应该是

q2 = "%#{q.downcase}%" 
search_results = self.find(:all, 
       :select => 'id,fb_id,fname,lname,org_id', 
       :conditions => 
    ["(guest = ? OR fb_id is not null) AND (
    trim(lower(fname)) LIKE ? OR 
    trim(lower(lname)) LIKE ?)", 
    false, q2, q2], 
    :limit => 8 
) 

编辑我离开了不能在空测试。我还改进了q2的设置。我遵循了mu关于处理特定于dbms的假常量的建议。

1

我会打破它分为三个命名范围,即像(模型):

scope :guest = self.find_by_guest(id) 
scope :fb = self.find_by_fb_id(fb_id) 
scope :name_check = self.find("trim(lower(fname)) || ' ' || trim(lower(lname)) LIKE ?", q.downcase) 

(不需要那些“%的”护栏及等)。

,那么你可以在User.guest(guest_id).fb(fb_id).name_check(:username)
连锁在一起,这些或单独作为User.name_check

然后你可以混合和匹配的意愿,找到什么可行,什么不可行。