2012-01-16 79 views
0

使用ActiveRecord我提出這個查詢的ActiveRecord + SQLite的3行爲異常

AdImage.select("ad_images.id, ad_images.locale_id, ad_campaigns.click_url, 
ad_campaigns.default_ad_image_id").joins("left outer join ad_campaigns on 
ad_campaigns.id = ad_images.ad_campaign_id").where("ad_images.ad_campaign_id" => 1) 

生成以下SQL查詢:

SELECT ad_images.id, ad_images.locale_id, ad_campaigns.click_url, 
ad_campaigns.default_ad_image_id FROM "ad_images" left outer join ad_campaigns on 
ad_campaigns.id = ad_images.ad_campaign_id WHERE "ad_images"."ad_campaign_id" = 1 

,結果如下:

=> [#<AdImage id: 22, click_url: "market://details?id=com.mobiata.flighttrack", 
    locale_id: 2>] 

這是錯誤的。

所以我用的ActiveRecord :: Base.connection.execute方法來直接運行SQL查詢:

ActiveRecord::Base.connection.execute("SELECT ad_campaigns.click_url, ad_images.id, 
ad_images.locale_id, ad_campaigns.default_ad_image_id FROM ad_campaigns inner join 
ad_images on ad_campaigns.id = ad_images.ad_campaign_id WHERE ad_images.ad_campaign_id = 1") 

其返回如下:

[{"click_url"=>"market://details?id=com.mobiata.flighttrack", "id"=>22, "locale_id"=>2, 
"default_ad_image_id"=>22, 0=>"market://details?id=com.mobiata.flighttrack", 1=>22, 
2=>2, 3=>22}] 

它具有奇特的重複它。

第一個和第二個唯一的區別是表格名稱中的「ad_images」與ad_images。

我的問題是:

1)我不明白是什麼讓這種差異。

2)爲什麼第二個查詢返回SQLite3中的垃圾,而它在MySQL服務器中沒有發生?

+0

我實現了第一個查詢具有AdImage在前面,所以它爲什麼給AdImage列只(AdImage和AdCampaign都有CLICK_URL,我忘了,讓我感到困惑。)但是第二個問題還是需要一個很自然回答。 – nextofsearch 2012-01-16 06:16:40

+0

SQLite 3似乎返回索引值和列名稱的結果,我猜儘管MySql返回只與列名稱resultes。 – nextofsearch 2012-01-16 06:21:02

回答

0
  1. 我最終使用「ActiveRecord :: Base.connection.execute」而不是使用Rails的ActiveRecord助手。似乎沒有其他解決方案。

  2. 事實證明,您應該在調用值時使用索引值而不是雙引號列名。否則,在使用MySQL進行生產時,您會遇到Type錯誤。