2011-03-07 15 views
1

私は結合クエリを使用して、クエリと共に他のテーブルの属性を取得しています。ここで結合されたテーブルのデータは型変換されていません

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.namestate.timeを使用しています。より良い方法がありますか?

答えて

1

は、ここで何をしたい、おそらくです:

class City < ActiveRecord::Base 
    belongs_to :state 
end 

class State < ActiveRecord::Base 
    has_many :cities 
end 

a = City.joins(:state).includes(:state).where(['states.name = ?', params[:state]]).first 
a.state.time 

これは内部結合を使用して動作し、いくつかの条件があります。

  • 市は、一つだけの状態に属している必要があります。都市がどのような状態に属していない場合は、内側が

Railsの2構文

a = City.find(:all, :conditions => ['states.name = ?', params[:state]], :joins => :state, :include => :state) 
+0

元の問題への参加のため、私が直面していますRailsがやるということであるため、クエリはそれを返しません文字列をオブジェクトに型キャストすることで多くのことができます。結合されたテーブルの場合は、これらすべてを覚えておいてください。そのため、私は 'State'モデルオブジェクトを初期化していますが、' State.new'が設定ファイルに定義されているタイムゾーンでTimeを取っているので動作しません。 – rubyprince

+0

ねえ、私は私の答えを完全に編集しました。なぜLEFT JOINを使ったのですか? – sled

+0

ok..thanks..got it ..私はすでに既存のコードで作業していましたが、どうして残った結合が使われたのか分かりませんが、内部結合で十分です.BTW Rails 2で同等のものを見つけようとしていますがこれはうまくいくでしょう。私は 'have.will'を使用して' a.state'を呼び出しながら別のSQLクエリを実行することを防ぎます。通常の場合、クエリ 'SELECT * from states =#{a.state_id}'を起動しますか? – rubyprince

関連する問題