【问题标题】:search the records using two keys in two tables in rails使用rails中两个表中的两个键搜索记录
【发布时间】:2023-03-06 07:54:01
【问题描述】:

我有名为 User 和 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

有人可以提出更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails rails-models


    【解决方案1】:

    用户可以提供不止一项服务

    这意味着 UserService 模型关联到 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,从中选择提供我们所需服务的用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多