ActiveRecord + SQLite 3表现得很奇怪

时间:2012-01-16 06:08:35

标签: mysql ruby-on-rails activerecord sqlite

使用activerecord我做了这个查询

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服务器中却没有?

1 个答案:

答案 0 :(得分:0)

  1. 我最终使用“ActiveRecord :: Base.connection.execute”而不是使用Rails的ActiveRecord助手。似乎没有其他解决方案。

  2. 事实证明,在调用值时,应使用索引值而不是双引号列名。否则,在使用MySQL进行生产时,您将遇到类型错误。