2012-05-01 41 views
2

我一直在爲此奮鬥了整整一天。Rails 3基於範圍的活動記錄抓取關聯模型

這是我的。 A User型號和Address型號。 Userhas_many :addressesAdddressbelongs_to :user

現在我想要搜索其電子郵件中包含授權字詞的用戶,或者其中一個用戶的地址包含該字詞。因此,可以說這個詞是'jap',任何Useremail 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%') 

但這不是它應該如何工作。我曾嘗試過使用包含和Google搜索功能,但尚未找到解決方案。任何人都遇到過這個?

編輯#1:有2個疑問很多類似的解決方案,我所追求的是一個單一的查詢解決方案,因爲對我來說沒有任何意義適用上的地址相同條件下的兩倍。

回答

1

您可以在類似於以下內容的地址模型上使用命名範圍嗎?

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

這樣你可以做users.first.addresses.city_or_line_like('arg')

+0

這和上面幾乎一樣,我已經這樣做了。但有了這個,我已經跑了兩個querries。像這樣 'users = User.user_or_address_like('arg')' 然後 'users.first.addresses.city_or_line_like('arg')' – Abid

+0

我真正想要的是一個querry匹配並且還帶回匹配該用戶的地址 – Abid