0
ShiftNote belongs_to Shift has_many ShiftNote

範囲が欲しいShiftNote.by_month("2013-10")

それを実装する方法は?

今私はしようとしています:

ShiftNote.includes(:shift)
          .where("shifts.starts_at <= ? AND shifts.starts_at >= ?", "2013-10-01".to_date, "2013-10-30".to_date)

しかし、私は得る

ShiftNote.includes(:shift).where("shifts.starts_at <= ? AND shifts.starts_at >= ?", "2013-10-01".to_date, "2013-10-30".to_date) 非推奨警告:文字列 SQL スニペットで参照されているテーブル (shift_notes、shifts のいずれか) を積極的にロードしているようです。例えば:

Post.includes(:comments).where("comments.title = 'foo'")

現在、Active Record は文字列内のテーブルを認識し、別のクエリでコメントをロードするのではなく、コメント テーブルをクエリに JOIN することを認識しています。ただし、本格的な SQL パーサーを作成せずにこれを行うと、本質的に欠陥があります。SQL パーサーを書きたくないので、この機能を削除します。これからは、文字列からテーブルを参照するときは Active Record に明示的に伝える必要があります。

Post.includes(:comments).where("comments.title = 'foo'").references(:comments)

暗黙的な結合参照に依存しない場合は、設定することで機能を完全に無効にすることができます config.active_record.disable_implicit_join_references = true。SQL (1.6ms) SELECT shift_notes. idAS t0_r0, shift_notes. stateAS t0_r1, shift_notes. user_idAS t0_r2, shift_days. shift_idAS t0_r3, shift_notes. created_atAS t0_r4, shift_notes. updated_at AS t0_r5, shifts. idAS t1_r0, shifts. starts_atAS t1_r1, shifts. ends_atAS t1_r2, shifts. rateAS t1_r3, shifts. limitAS t1_r4, shifts. created_atAS t1_r5, shifts. updated_atAS t1_r6, shifts. stateAS t1_r7, shifts. shift_notes_countAS t1_r8 FROM shift_notesLEFT OUTER JOIN shiftsON shifts. id= shift_notes.shift_idWHERE (shifts.starts_at <= '2013-10-01' AND shifts.starts_at >= '2013-10-30')

4

1 に答える 1

1

BETWEEN日付の範囲を使用して達成されるクエリを使用できます。

class ShiftNote < ActiveRecord::Base
  scope :by_month, ->(year = Date.today.year, month = Date.today.month) do
    first_day = Date.new(year, month, 1)
    last_day = Date.new(year, month + 1, 1) - 1
    joins(:shifts)
    .where('shifts.starts_at' => first_day..last_day)
  end
于 2013-10-21T14:15:17.750 に答える