私は、当社の基本的なイントラネットであるRails3アプリケーションを持っています。現在の日付と一致するスケジュールされた日付で作成されたアナウンスをチェックするアナウンスコントローラーがあります。
class Announcement < ActiveRecord::Base
scope :active, lambda {
where("starts_at <= ? AND ends_at >= ?", Time.now.utc, Time.now.utc)
}
scope :since, lambda { |hide_time|
where("updated_at > ? OR starts_at > ?", hide_time.utc, hide_time.utc) if hide_time
}
def self.display(hide_time)
active.since(hide_time)
end
end
ただし、ほとんどのお知らせは、終了予定日から約1週間以内に削除されます。他のすべてのアナウンスは、スタッフへの簡単な誕生日メッセージです。アナウンスシステムの使用方法により、誕生日メッセージなどは毎年行われるため、年ではなく日/月のみをチェックするのが賢明なようです。
コントローラコードで年を「無視」する最も簡単な方法は何でしょうか。
アップデート
コントローラコードを以下のコードに更新しましたが、終了日時以降にアナウンスが非表示になりません。
class Announcement < ActiveRecord::Base
scope :active, lambda {
where("day(starts_at) <= ?
AND month(starts_at) <= ?
AND day(ends_at) >= ?
AND month(ends_at) >= ?",
Time.now.utc.day,
Time.now.utc.month,
Time.now.utc.day,
Time.now.utc.month)
}
scope :since, lambda { |hide_time|
where("day(starts_at) > ?
AND month(starts_at) > ?",
hide_time.utc.day, hide_time.utc.month) if hide_time
}
def self.display(hide_time)
active.since(hide_time)
end
end
レコードの例:
22, 'Test Announcement', 'This is a test announcement, please ignore it. Seriously - stop reading.', '2012-06-25 13:40:00', '2012-06-25 13:55:00', '2012-06-25 13:47:23', '2012-06-25 13:52:15');
日時フィールドの入力選択ボックスに:exclude_yearを設定しましたが、それでも現在の年が入力されます。