我一直在为此苦苦挣扎一整天。
这就是我所拥有的。 User
模型和Address
模型。 User
has_many :addresses
和Adddress
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个查询,我所追求的是单个查询解决方案,因为对我来说,在地址上应用相同条件两次没有意义
答案 0 :(得分:1)
您是否可以在地址模型上使用类似于以下内容的命名范围?
named_scope :city_or_line_like, lambda { |str| {
:conditions => ['conditions here']
}}
这样你可以做users.first.addresses.city_or_line_like('arg')
?