【问题标题】:search the records using two keys in two tables in rails使用rails中两个表中的两个键搜索记录
【发布时间】:2023-03-06 07:54:01
【问题描述】:
我有名为 User 和 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
有人可以提出更好的方法吗?
【问题讨论】:
标签:
ruby-on-rails
rails-models
【解决方案1】:
用户可以提供不止一项服务
这意味着 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_name 和 service_name:
User.joins(:services).where('users.location_name = ? and services.service_name = ?', location_name ,service_name)
【解决方案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,从中选择提供我们所需服务的用户。