2014-04-06 75 views
2

我有一個名爲用戶和服務搜索使用兩個密鑰記錄在兩個表中軌

用戶模型的模型有以下欄目:user_namelocation_name

服務模式有以下欄目:user_locationservice_name

現在我想搜索居住在特定位置並提供特定服務的用戶。

主要問題是用戶可以提供多個服務。

我已經實現了通過以下方式功能:

serv1 = Services.find_by_service_name(service_name) 

res = [] 
serv1.each do |s| 
    res.push s if s.user_location == location_name 
end 

任何人可以提出一個更好的辦法嗎?

回答

3

用戶可以提供多個服務

這意味着User關聯到Service模型has_many關係,即你的模型應該是這樣的:

class User < ActiveRecord::Base 
    has_many :services 
    ## ... 
end 

class Service < ActiveRecord::Base 
    belongs_to :user 
    ## ... 
end 

接下來,您必須在services表中有一個foreign_key user_id

現在我想要搜索位於特定 位置並提供特定服務的用戶。

你可以用下面提到的查詢來實現這個結果。確保在執行此查詢之前設置局部變量location_nameservice_name

User.joins(:services).where('users.location_name = ? and services.service_name = ?', location_name ,service_name) 
2

看來您正在服務模型中存儲來自用戶模型的字段。我不確定這是否可取。

user有一個location_nameservice引用user表中的整行,而不是列,這就是location_name。然後,您可以與特定的serviceuser的所有方面進行交互。此外,由於您聲明用戶可以提供多項服務,因此我們可以假定多個用戶可以提供相同的服務。 user也必須參考它的services

利用上述結構,您的溶液然後可以:

matched_users = User 
    .find_by_location_name(location_name) 
    .select { |user| user.service_names.include?(desired_service) } 

這將數據庫,User.find_by_location(location_name),將從所需的位置返回用戶執行一個查詢。然後我們可以調用ruby enum方法select,從中我們選擇提供所需服務的用戶。