2

我已经为此苦苦挣扎了一整天。

这就是我所拥有的。一个User模型和一个Address模型。User has_many :addressesAdddress belongs_to :user

现在我想搜索其电子邮件包含给定术语的用户,或者其中一个用户的地址包含该术语。所以可以说这个词是'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 个查询,我追求的是一个单一的查询解决方案,因为对我来说,两次对地址应用相同的条件是没有意义的。

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 回答