2012-04-02 13 views
0
で私のRailsアプリケーションで

をModel.find_by_queryを使用している間、 私はテーブルが異なる数の列を持っているので、私は仮想列を使用していますModel.find_by_query違いRailsの

を使用してユニオンクエリを行っております。私はMySQLでクエリ、 を実行しているが、Model.find_by_sqlと同じクエリを実行し、適切な出力を取得しています

"SELECT id, 'N/a' AS start_time, 'N/a' AS end_time, 'N/a' AS 
STATUS , project_id, spent_on AS DATE, user_id, hours AS spent_time, comments AS 
COMMENT , activity_id 
FROM table1 
WHERE spent_on > DATE_ADD(CURDATE() , INTERVAL -30 
DAY) 
AND user_id =80 
UNION (

SELECT id, start_time, end_time, 
STATUS , project_id, DATE, user_id, spent_time, 
COMMENT , activity_id 
FROM table2 
WHERE user_id =80 
AND DATE > DATE_ADD(CURDATE() , INTERVAL -30 DAY) 
)" 

よう

私のクエリは私にこれは出力iが

異なる出力を与えるに見えますmysqlの

enter image description here

にModel.find_byながら、クエリを実行している取得しています_sql()を返すだけの数の列、

<Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9> 

はまた、値の不一致もありますことに注意してください。 'N/a'の代わりに、「2000-01-01 00:00:00」が時間フィールドに表示されています。

フィールドタイプが時刻なので、「N/A」は「2000-01-01 00:00:00」に変換されていることがわかりました。そこで、Railsはそれをある時間値に変換します。

これを無効にすることはできますか?

希望の出力を得るにはどうすればよいですか?そのような生のクエリを実行するための他の方法?

コメントしてください。

Thnx。

+0

現在作業しているレールのバージョンは? –

+0

そのレール2.3.14 –

+0

Model.find_by_sql()を実行しているときにModelと一致しない列が無視されていることがわかりました。 –

答えて

0

ここでは2つの問題があります.1つは結果セットが型キャストされていないこと、もう1つは列がないことです。

あなたは私の知る限りは、型キャストの問題のために見ることができるように2つのオプションがあります。型キャストせずに

  1. アクセスデータを。レールモデル上の各属性は、属性(例えばtask.start_datetask.start_date_before_type_casttask.user_idtask.user_id_before_type_castなど)「_before_type_cast」対応している、代わりにこれらの属性を使用すると、あなたの代わりに「2000-01-01 00の「N/A」が表示されます:00:00 "
  2. 別のエイリアス(new_start_dateとしてSELECT" N/A "など)を使用すると、レールは生の列として読み取られ、型キャストは実行されません。もし第二の問題については

、カラムは、(あなたが上に置くのコードを出力するものである)inspect方法が唯一のタスクデータベーステーブルのカラムについて知っているという理由だけで、それはだ、そこではないと表示されない場合がありながら、あなたのSQLクエリの列。ただし、データはそこにあり、他の属性と同様にアクセスできます。

>> results = Model.find_by_sql('SELECT columns FROM table WHERE conditions') 
>> results[0] 
=> <Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9> 
>> results[0].comment 
=> "test" 
+0

うわー。それは非常に便利でした。多くのthnx。 1つは、Railsがフィールド名を大文字と小文字を区別して扱うことに気づいたことです。 mysqlのデフォルトではフィールド名に大文字小文字を区別しないので、同じクエリがデータベース(mysql)で実行されていました。今あなたの答えの結果[0]で述べたように.COMMENTは私のために働いた。なぜなら、私は 'コメント'を持っていて、 'コメント' –

関連する問題