【问题标题】:Active record query for a query in railsRails 中查询的活动记录查询
【发布时间】:2015-09-09 21:20:56
【问题描述】:

我正在开发一个具有“请求”、“服务”和“价格”三个模型的 Rails 应用程序。请求和服务具有 has_many_through 关系,服务和价格具有 has_one-belongs-to 关系,即服务具有一个价格,价格属于服务。

有关系的模型

 class Request < ActiveRecord::Base
    has_many :request_services
    has_many :services, through: :request_services
 end

 class RequestService < ActiveRecord::Base
   belongs_to :service
   belongs_to :request
 end

 class Service < ActiveRecord::Base
    has_many :request_services
    has_many :requests, through: :request_services
    has_one :price
 end

 class Price < ActiveRecord::Base
    belongs_to :service
 end

现在用户将创建一个可以包含许多服务的新请求。所以,我想写一个查询来选择用户在他的请求中选择的服务的价格。

到目前为止,我已经编写了这个查询,

1) 在请求中查找服务

 Request.find(1).services

2)在此之后我想获得所选服务的价格,所以我写了

 Request.find(1).services.prices

但是这个查询抛出错误。

在 Rails 控制台中运行此查询时遇到的错误

谁能帮我写查询以获取所有选定服务的价格

  Request Load (0.2ms)  SELECT  "requests".* FROM "requests" WHERE "requests"."id" = ? LIMIT 1  [["id", 1]]
  NoMethodError:   Service Load (0.3ms)  SELECT "services".* FROM "services" INNER JOIN "request_services" ON "services"."id" = "request_services"."service_id" WHERE "request_services"."request_id" = ?  [["request_id", 1]]
 undefined method `prices' for #<Service::ActiveRecord_Associations_CollectionProxy:0x007f4ec4c41bb0>

【问题讨论】:

  • 请与您分享具有重要关系声明的模型类并提供完整的错误消息。
  • 我已经更新了问题,添加了我的模型类和我在 rails 控制台中遇到的错误

标签: ruby-on-rails rails-activerecord


【解决方案1】:

也许你可以反过来解决它:

Price.joins(service: { request_services: :request}).where('requests.id = ?', request_id)

这将获取与具有给定 id 的请求相关的所有价格

【讨论】:

    【解决方案2】:

    您需要致电Request.find(1).services.price(价格为单数),因为每项服务只有一个价格

    【讨论】:

      【解决方案3】:

      基本上您的查询状态是:“对于这个请求 (1) 给我每个相关服务的价格”

      但是链接不是这样工作的。我不确定您为什么使用 has_many-through 调用 RequestService,但无论如何,您有多种选择来获取请求、连接、迭代和添加到数组或最简单的添加的价格数据-许多通过价格。

      例如

      迭代并添加到数组

      prices = []
      Request.find(1).services.each { |s| prices << s.price }
      

      有很多通过

      class Request < ActiveRecord::Base
        has_many :request_services
        has_many :services, through: :request_services
        has_many :prices, through: :services
       end
      

      这会让你做什么:

      Request.find(1).prices
      

      【讨论】:

      • 这种方法需要我改变我的模型关系,我不想仅仅为了查询工作而改变我的模型。我可以用其他方式吗?可能是在 Rails 活动记录中编写正确的 sql 查询?
      • @LovishChoudhary 总是有其他选择,但不知道如何或在哪里使用它,很难为正确的情况确定正确的答案。
      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多