使用rails中两个表中的两个键搜索记录

时间:2014-04-06 16:32:10

标签: ruby-on-rails rails-models

我有名为User and Service的模型

用户模型包含以下列: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

有人能提出更好的建议吗?

2 个答案:

答案 0 :(得分:3)

  

用户可以提供多个服务

这意味着User与具有Service关系的has_many模型相关联,即您的模型应如下所示:

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

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

接下来,您必须在user_id表格中有一个foreign_key services

  

现在我想搜索位于特定用户的用户   地点和提供特定服务。

您可以使用下面提到的查询来实现此结果。确保在执行此查询之前设置局部变量location_nameservice_name

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

答案 1 :(得分:2)

您似乎在服务模型中存储了用户模型中的字段。我不确定这是否可取。

user有一个location_nameservice引用user表中的整行,而不是列location_name。然后,您可以与特定service user的所有方面进行互动。此外,由于您声明用户可以提供多项服务,因此我们可以假设多个用户可以提供相同的服务。 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,我们从中选择提供所需服务的用户。