Rails 3 Active Record根据范围获取关联模型

时间:2012-05-01 21:10:57

标签: ruby-on-rails activerecord

我一直在为此苦苦挣扎一整天。

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

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

1 个答案:

答案 0 :(得分:1)

您是否可以在地址模型上使用类似于以下内容的命名范围?

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

这样你可以做users.first.addresses.city_or_line_like('arg')