所以..只需从3.0.6升级到3.0.14,我的一个测试开始失败(太棒了!)。它指出(我认为)我的where子句是错误形成的,我只是“侥幸逃脱”。只是想确认一下(如果有人能指出我可以在哪里找到关于记录这一变化的文档)。
一些代码:
@fields = Field.joins(:region => :country).where(:regions => {:country_id => @country}).order(:name)
生成快乐的SQL
"SELECT `fields`.* FROM `fields` INNER JOIN `regions` ON `regions`.`id` = `fields`.`region_id` INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` WHERE `regions`.`country_id` = 5 ORDER BY name"
但是这个查询......
@pools = Pool.joins(:field => {:region => :country}).where(:fields => {:regions => {:country_id => @country }},:confirmed => true).order(:leaving_date)
这会在3.0.6中生成ok SQL
"SELECT `pools`.* FROM `pools` INNER JOIN `fields` ON `fields`.`id` = `pools`.`field_id` INNER JOIN `regions` ON `regions`.`id` = `fields`.`region_id` INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` WHERE `pools`.`confirmed` = 1 AND `regions`.`country_id` = 5 ORDER BY leaving_date"
但是在3.0.14中它的国家ID有一个borked值(似乎是整个活跃记录?)
"SELECT `pools`.* FROM `pools` INNER JOIN `fields` ON `fields`.`id` = `pools`.`field_id` INNER JOIN `regions` ON `regions`.`id` = `fields`.`region_id` INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` WHERE `pools`.`confirmed` = 1 AND `fields`.`regions` = '--- \\n:country_id: !ruby/ActiveRecord:Country \\n attributes: \\n name: Test Country 1\\n latitude: \\\"13.456\\\"\\n created_at: 2012-06-27 10:28:46 Z\\n updated_at: 2012-06-27 10:28:46 Z\\n id: 2\\n cached_slug: test-country-1\\n longitude: \\\"46.789\\\"\\n message: \\n zoom: 4.0\\n' ORDER BY leaving_date"
只是想知道是否有人可以解释这里发生了什么。我怀疑它可能永远不会有效..
答案 0 :(得分:3)
那应该只是
Pool.joins(:fields => {:region => :country}).
where(:regions => {:country_id =>@country})
仅仅因为你通过另一个表加入表并不意味着你需要在where子句中做同样的事情 - 你想要的只是表单的条件
regions.country_id = 1
这曾经是偶然的工作,不幸的是同样的事故还可以让人们注入恶意制作的值,所以固定在rails 3.0.13 / 14 security releases
据我所知,这不应该有用,但实际上没有任何关于它被移除的文档。