2010-09-29 36 views
0

使用Rails 3积极关系,我有一个范围:在NULL(NULL)不匹配正确

scope :duplicate_contact, lambda {|contact| where(
        :person_id   => contact.person_id, 
        :salutation   => contact.salutation, 
        :first_name   => contact.first_name, 
        :last_name   => contact.last_name, 
        :suffix    => contact.suffix, 
        :birthday   => contact.birthday, 
        :address   => contact.address, 
        :city    => contact.city, 
        :state    => contact.state, 
        :zip    => contact.zip, 
        :phone_1   => [contact.phone_1,contact.phone_2,contact.phone_3], 
        :phone_1_type  => [contact.phone_1_type,contact.phone_2_type,contact.phone_3_type], 
        :phone_2   => [contact.phone_1,contact.phone_2,contact.phone_3], 
        :phone_2_type  => [contact.phone_1_type,contact.phone_2_type,contact.phone_3_type], 
        :phone_3   => [contact.phone_1,contact.phone_2,contact.phone_3], 
        :phone_3_type  => [contact.phone_1_type,contact.phone_2_type,contact.phone_3_type], 
        :email    => [contact.email,contact.alternate_email], 
        :alternate_email => [contact.email,contact.alternate_email] 
      ) 
      } 

这有一个问题,当:电子邮件是NULL。它返回零行,实际上它应该返回至少1行,即duplicate_contact(contact).size == 0为真时,它应该是false。

我认为这与mysql文档中的这个问题有关:“在SQL中,与任何其他值相比,NULL值都不为真,即使为NULL。”

我怎样才能得到这个返回正确的结果?

+0

'范围= scope.where(:电子邮件=> [c.email,c.alternate_email] .compact.presence)如果email' – glebm 2010-09-29 03:32:36

+0

我不认为电子邮件是在范围内的最后一个if子句... – DGM 2010-09-29 03:56:35

回答

0

的一种可能的解决方案,我发现:

scope :duplicate_contact, lambda {|contact| 

    q = where(
     :person_id   => contact.person_id, 
     :salutation   => contact.salutation, 
     :first_name   => contact.first_name, 
     :last_name   => contact.last_name, 
     :suffix    => contact.suffix, 
     :birthday   => contact.birthday, 
     :address   => contact.address, 
     :city    => contact.city, 
     :state    => contact.state, 
     :zip    => contact.zip 
    ) 
    [contact.phone_1,contact.phone_2,contact.phone_3].compact.each{|p| q=q.has_phone(p)} 
    [contact.phone_1_type,contact.phone_2_type,contact.phone_3_type].compact.each{|p| q=q.has_phone_type(p)} 
    [contact.email,contact.alternate_email].compact.each{|p| q=q.has_email(p)} 
    q 
    } 
    scope :has_phone, lambda {|phone| 
    where("'#{phone}' IN (phone_1,phone_2,phone_3)") 
    } 
    scope :has_phone_type, lambda {|phone| 
    where("'#{phone}' IN (phone_1_type,phone_2_type,phone_3_type)") 
    } 
    scope :has_email, lambda {|email| 
    where("'#{email}' IN (email,alternate_email)") 
    }