0

Rails 3 のアクティブ リレーションを使用して、スコープを設定しました。

  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]
            )
          }

:email が NULL の場合、これには問題があります。実際には少なくとも 1 行を返す必要があるのに、ゼロ行を返します。つまり、duplicate_contact(contact).size == 0 false であるべきときに true になります。

これは、mysql ドキュメントの次のステートメントに関係していると思います。

これを正しい結果に戻すにはどうすればよいですか?

4

1 に答える 1

0

私が見つけた1つの可能な解決策:

 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)")
  }
于 2010-09-29T03:55:59.123 に答える