2016-09-10 12 views
0

誰でもこの問題の解決に私を助けることができますか? PGのJOIN selectから配列の結果を読み込もうとしています。SQL 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| 

は、どのように私は私のモデルでは、配列から値を読み取ることができます。 partners.id、routes_rates.id_veh_class、routes_rates.min_price、routes_rates.km_rate、routes_rates.startは、

をroutes.id?

私がしようとしていたmenyオプション:

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

答えて

1

あなたはおそらく良いだろうあなたは超巨大なテーブルやメモリを持っていない限り、取り扱いが加入の「Railsの道」からそれに近づい使用は大きな懸念事項です。

あなたのクエリからは、パートナー、RoutesRate、Routeの3つのモデルがあるようです。パートナーが多くの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は、ほとんどの場合、結合または2番目のクエリについて適切な選択を行います。私が見るところでは、idの代わりにパートナーテーブルを使用していません。これはid_partnerと同じです。

もちろん、これはすべてクエリーの推論によって行われるため、モデルが異なる場合があります。必要に応じて調整します。 rate_routeインスタンスを取得し、.routeを呼び出して、ルート情報にアクセスします。

0

これは、パートナーオブジェクトと選択されたフィールドを持つ配列を返します。

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と呼ぶと、配列が得られます。 配列がnilではないと仮定すると、Partner.method_name[0]は、SELECTedフィールドを持つpersonオブジェクトを提供します。

0

皆さん、ありがとうございました!最終的に最後の列をエイリアスにして、列挙された順序で値を呼び出して問題を解決します。

 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

関連する問題