【问题标题】:SQL JOIN query and read results in array (rails)SQL JOIN 查询并读取数组中的结果(rails)
【发布时间】:2016-09-10 20:01:15
【问题描述】:

谁能帮我解决这个问题?我正在尝试从 PG 中的 JOIN 选择中读取数组中的结果。

i=0;

sql = "
    SELECT partners.id, routes_rates.id_veh_class, routes_rates.min_price, routes_rates.km_rate, routes_rates.start, routes.id FROM routes
    JOIN partners ON routes.id_partner = partners.id
    JOIN routes_rates ON routes.id = routes_rates.id_route
    WHERE st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}', 4326)) AND routes_rates.active = '1'"

    sear = ActiveRecord::Base.connection.execute(sql)
    sear.each do |sear|

如何在我的模型中读取数组中的值: partner.id、routes_rates.id_veh_class、routes_rates.min_price、routes_rates.km_rate、routes_rates.start、routes.id

?

我尝试了很多选择:

partner_id = sear.values[i]['partners.id'];
partner_id = sear.values[@i][0];
partner_id = sear.values['@i']['partners.id'];
partner_id = sear.values['#{@i}']["partners.id"];
partner_id = sear.values['#{i}'][0];
partner_id = sear.values["#{@i}"][0];

非常感谢, T

【问题讨论】:

    标签: ruby-on-rails arrays postgresql


    【解决方案1】:

    除非你有超大的表并且内存使用是一个主要问题,否则你可能会更好地从处理连接的“Rails 方式”来处理它。

    根据您的查询,您似乎有 3 个模型,Partner、RoutesRate、Route。合作伙伴拥有许多 RoutesRate 的许多 Routes(措辞很奇怪,我猜是从那个和列名判断的遗留数据)。

    假设您已在这些模型中声明了适当的 belongs_to 和 has_many,您应该能够更改代码以使用 ActiveRecord 关联。

    rate_routes = RoutesRate.includes(:route).where("st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}', 4326)) AND routes_rates.active = '1'")
    

    #includes 将在大多数情况下对连接或第二个查询做出适当的选择。据我所知,除了id,您根本没有使用合作伙伴表,这与id_partner相同。

    当然,这一切都只是从您的查询中推断出来的,因此您的模型可能会有所不同。根据需要进行调整。通过获取 rate_route 实例并调用 .route 来访问路线信息。

    【讨论】:

      【解决方案2】:

      这将返回一个包含合作伙伴对象和选定字段的数组。

      def method_name
            return Partner.find_by_sql(" "
                SELECT partners.id, routes_rates.id_veh_class,  routes_rates.min_price, routes_rates.km_rate, routes_rates.start, routes.id    
                FROM routes
                JOIN partners ON routes.id_partner = partners.id
                JOIN routes_rates ON routes.id = routes_rates.id_route
                WHERE st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}',4326)) 
                AND routes_rates.active = '1'"
      end
      

      您可以找到更多信息here。假设方法位于app/model/partner.rb 中并且您调用Partner.method_name.class 您将获得数组。 假设数组不为零,Partner.method_name[0] 将为您提供带有SELECTed 字段的人员对象。

      【讨论】:

        【解决方案3】:

        感谢你们两位!我终于解决了问题,将别名设为最后一列,并按列出的顺序调用这些值。

              partner_id = sear.values[0];
              id_veh_class = sear.values[1];
              min_price = sear.values[2];
              km_rate = sear.values[3];
              start = sear.values[4];
              id_route = sear.values[5];
        

        问题在于两个表中列的名称 (id) 相同:合作伙伴和路由,第二个 (routes.id) 覆盖了第一个的值。

        T

        【讨论】:

          猜你喜欢
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多