私は結合クエリを使用して、クエリと共に他のテーブルの属性を取得しています。ここで結合されたテーブルのデータは型変換されていません
city = City.first(:select => "cities.*, states.name as state_name, states.time as state_time"
:joins => "LEFT JOIN states on cities.state_id = states.id",
:conditions => ["states.name = ?", params[:state]])
は、問題は、私はcity.state_time
などの結合テーブルから値を取得するとき、私は(何の型キャストは、これらのフィールドのためのRailsによって行われません)の代わりに時刻オブジェクトの2010-11-12 05:00:00
のような文字列を取得することです。 Cityモデルを呼び出しているので意味があり、型キャスト時間列に使用されるメソッドはStateモデルになります。私はこのような時間を明示的に解析しなければならないでしょうし、タイムゾーンの問題とも戦わなければなりません。 (RailsはTimeオブジェクトを与えている間にいくつかのカスタマイズを行い、これらのカラムに対してはこれを行う必要があります)。結合を実行している間に列を状態にリンクする方法はありますか?私が考えていた方法の1つはこのようなものでした。
state = State.new(:name => city.state_name, :time => city.state_time)
とstate.name
とstate.time
を使用しています。より良い方法がありますか?
元の問題への参加のため、私が直面していますRailsがやるということであるため、クエリはそれを返しません文字列をオブジェクトに型キャストすることで多くのことができます。結合されたテーブルの場合は、これらすべてを覚えておいてください。そのため、私は 'State'モデルオブジェクトを初期化していますが、' State.new'が設定ファイルに定義されているタイムゾーンでTimeを取っているので動作しません。 – rubyprince
ねえ、私は私の答えを完全に編集しました。なぜLEFT JOINを使ったのですか? – sled
ok..thanks..got it ..私はすでに既存のコードで作業していましたが、どうして残った結合が使われたのか分かりませんが、内部結合で十分です.BTW Rails 2で同等のものを見つけようとしていますがこれはうまくいくでしょう。私は 'have.will'を使用して' a.state'を呼び出しながら別のSQLクエリを実行することを防ぎます。通常の場合、クエリ 'SELECT * from states =#{a.state_id}'を起動しますか? – rubyprince