0

私は、当社の基本的なイントラネットである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を設定しましたが、それでも現在の年が入力されます。

4

2 に答える 2

1

MySQL データベースを使用している場合は、その day() および month() メソッドを使用できます。これらの方法が他のデータベースでも見つかるかどうかはわかりません。したがって、このようにすると、コードがデータベース サーバーに依存するようになる可能性があります。

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)
}
于 2012-06-24T20:25:16.307 に答える
0

カップルのもの。OR ではなく AND を使用する必要があります。私が正しく理解している場合は、アイテムとアイテムの間の時間を希望します。2 つ目は、それが 1 日の始まりと終わりにあることを指定する必要があることです。現在は、24 時間の広がりを明確に表現していない現在に設定されています。

  class Announcement < ActiveRecord::Base
  scope :active, lambda {
    where('starts_at < ? AND ends_at > ?', Time.zone.now.end_of_day, Time.zone.now.beginning_of_day)
  }
  scope :since, lambda { |hide_time|
    where('updated_at > ? AND starts_at > ?', Time.zone.now.end_of_day, Time.zone.now.beginning_of_day)
  }
于 2012-06-24T22:54:19.880 に答える