2

私はこれに丸一日苦労しています。

これが私が持っているものです。UserモデルとモデルAddressUser has_many :addressesAdddress belongs_to :user

ここで、電子メールに特定の用語が含まれているユーザー、またはユーザーのアドレスの 1 つにその用語が含まれているユーザーを検索したいと考えています。したがって、用語が「jap」であるとしましょう。住所市または住所行が返されるユーザーまたはユーザーUserが返されます。email like '%jap%'like '%jap%'

このような単純な結合でユーザーを取得できます

users = User.joins('LEFT OUTER JOIN addresses ON users.id=addresses.user_id').where('users.email like '%jap%' OR addresses.city like '%jap%' OR addresses.address_line like '%jap%')

これにより、必要なユーザーが得られます。私が欲しいのは、返されたユーザーとともに、基準に一致したアドレスも必要であることです。

上記の後に私が行う場合

users.first.addresses

そのユーザーのすべてのアドレスが表示されます。このようなユーザーのアドレスに対して別のクエリを実行することでできることを知っています

users.first.addresses.where( addresses.city like '%jap%' OR addresses.address_line like '%jap%')

しかし、それはそれが機能する方法ではありません。インクルードを試してグーグルで検索しましたが、まだ解決策が見つかりません。誰もこれに出くわしたことがありますか???

編集#1:2つのクエリを使用した同様のソリューションが多数あります。私が求めているのは、単一のクエリソリューションです。アドレスに同じ条件を2回適用するのは意味がないからです。

4

1 に答える 1

1

次のようなアドレス モデルで名前付きスコープを使用できますか?

named_scope :city_or_line_like, lambda { |str| {
    :conditions => ['conditions here']
}}

そうすればできますusers.first.addresses.city_or_line_like('arg')か?

于 2012-05-01T21:16:16.490 に答える