3

だから.. 3.0.6 から 3.0.14 にアップグレードしただけで、私のテストの 1 つがひどく失敗し始めました (すばらしい!)。私の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 の値が壊れています (アクティブなレコード全体のようです?)

"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"

誰かがここで何が起こっているのか説明できるかどうか疑問に思っています。おそらくうまくいかなかったはずだと思います..

4

1 に答える 1

3

それはただあるべきです

Pool.joins(:fields => {:region => :country}).
     where(:regions => {:country_id =>@country})

別のテーブルを介してテーブルに参加したからといって、where句で同じことを行う必要があるわけではありません。必要なのはフォームの条件だけです。

regions.country_id = 1

これは偶然に機能していましたが、残念ながら同じ事故により、悪意を持って作成された値が注入される可能性があるため、レール3.0.13/14のセキュリティリリースで修正されました。

私が知る限り、これが機能するはずではなかったのですが、削除されることについてのドキュメントは実際にはありません。

于 2012-06-27T17:25:13.463 に答える