我有名为User and Service的模型
用户模型包含以下列:user_name
和location_name
服务模型包含以下列:user_location
和service_name
现在,我想搜索位于特定位置并提供特定服务的用户。
主要问题是用户可以提供多种服务。
我已通过以下方式实现了该功能:
serv1 = Services.find_by_service_name(service_name)
res = []
serv1.each do |s|
res.push s if s.user_location == location_name
end
有人能提出更好的建议吗?
答案 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_name
和service_name
:
User.joins(:services).where('users.location_name = ? and services.service_name = ?', location_name ,service_name)
答案 1 :(得分:2)
您似乎在服务模型中存储了用户模型中的字段。我不确定这是否可取。
user
有一个location_name
。 service
引用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
,我们从中选择提供所需服务的用户。