3

Rails アプリにMachineは、次の名前付きスコープを含むモデル があります。

named_scope :needs_updates, lambda {
  { :select => self.column_names.collect{|c| "\"machines\".\"#{c}\""}.join(','),
    :group => self.column_names.collect{|c| "\"machines\".\"#{c}\""}.join(','),
    :joins => 'LEFT JOIN "machine_updates" ON "machine_updates"."machine_id" = "machines"."id"',
    :having => ['"machines"."manual_updates" = ? AND "machines"."in_use" = ? AND (MAX("machine_updates"."date") IS NULL OR MAX("machine_updates"."date") < ?)', true, true, UPDATE_THRESHOLD.days.ago]
  }
}

この名前付きスコープは、開発モードで正常に機能します。ただし、本番モードでは、期待どおりに 2 つのモデルが返されますが、モデルは空または初期化されていません。つまり、実際のオブジェクトは返されますが ( ではありませんnil)、すべてのフィールドはnilです。たとえば、コンソールで名前付きスコープの戻り値を調べると、次のように返されます。

[#<Machine >, #<Machine >]

しかし、ご覧のとおり、返されるオブジェクトのすべてのフィールドは に設定されていnilます。

本番環境と開発環境は基本的に同じです。どちらも SQLite データベースを使用しています。クエリ用に生成される SQL ステートメントは次のとおりです。

SELECT
  "machines"."id",
  "machines"."machine_name",
  "machines"."hostname",
  "machines"."mac_address",
  "machines"."ip_address",
  "machines"."hard_drive",
  "machines"."ram",
  "machines"."machine_type",
  "machines"."use",
  "machines"."comments",
  "machines"."in_use",
  "machines"."model",
  "machines"."vendor_id",
  "machines"."operating_system_id",
  "machines"."location",
  "machines"."acquisition_date",
  "machines"."rpi_tag",
  "machines"."processor",
  "machines"."processor_speed",
  "machines"."manual_updates",
  "machines"."serial_number",
  "machines"."owner"
FROM
  "machines"
LEFT JOIN
  "machine_updates" ON "machine_updates"."machine_id" = "machines"."id"
GROUP BY
  "machines"."id",
  "machines"."machine_name",
  "machines"."hostname",
  "machines"."mac_address",
  "machines"."ip_address",
  "machines"."hard_drive",
  "machines"."ram",
  "machines"."machine_type",
  "machines"."use",
  "machines"."comments",
  "machines"."in_use",
  "machines"."model",
  "machines"."vendor_id",
  "machines"."operating_system_id",
  "machines"."location",
  "machines"."acquisition_date",
  "machines"."rpi_tag",
  "machines"."processor",
  "machines"."processor_speed",
  "machines"."manual_updates",
  "machines"."serial_number",
  "machines"."owner"
HAVING
  "machines"."manual_updates" = 't'
  AND "machines"."in_use" = 't'
  AND (MAX("machine_updates"."date") IS NULL
       OR MAX("machine_updates"."date") < '2010-03-26 13:46:28')

何がうまくいかないのですか?

4

3 に答える 3

0

これはあなたに起こっていることとは関係ないかもしれませんが、よく似ているように聞こえるので、ここで: Rails キャッシュを何かに使用していますか?

クエリの結果をキャッシュしようとしたときに、あなたとほぼ同じ結果が得られました ( railscast #115で説明されているように)。

私はこの問題を、キャッシュされた ActiveRecords を使用できなくする未解決の Rails バグに突き止めました。キャッシュされた AR を使用しないか、パッチを適用してメモリ リークが発生するかを選択する必要があります。

キャッシュは AR 以外のオブジェクトでも問題なく機能するので、必要なものを整数と配列に「変換」して、それをキャッシュしました。

お役に立てれば!

于 2010-04-05T19:18:14.420 に答える
0

グループ化が問題を引き起こしている可能性があるようです。開発と本番の両方でデータも同じですか?

于 2010-04-12T00:43:03.923 に答える
0

ええと、あなたが抱えていると思う問題を抱えているかどうかはわかりません。

[#<Machine >, #<Machine >]

配列で「検査」を呼び出したことを意味します...しかし、その中の個々のマシンオブジェクトのそれぞれではありません。これはばかげた質問かもしれませんが、返された個々の Machine オブジェクトに対して実際に inspect を呼び出して、列に nil があるかどうかを実際に確認したことがありますか?

Machine.needs_updates.each do |m|
  p m.inspect
end

?

それが実際に nil-column データになる場合。私の次の提案は、生成された SQL をコピーし、標準の mysql インターフェイスに移動して、その SQL を実行したときに何が得られるかを確認し、それを上記の質問に貼り付けて確認することです。

于 2011-06-16T14:25:40.937 に答える