0

スコープでDateTime.parseを使用して文字列を時刻に変換しようとしていますが、未定義のローカル変数エラーが発生します。

スコープ内のフィールドを変換することは可能ですか、それとも他のことを試す必要がありますか?

私のスコープ:

  scope :time_range, lambda {
    a = DateTime.parse(start_time_am)
    where("#{a} <= ?", Time.now.strftime('%H'))
  }  

- アップデート -

これをいじってみたところ、おそらくデフォルトのアクセサーを上書きする必要があることがわかりました。私は今次のものを持っています:

  def start_time_am
    read_attribute(:start_time_am).strftime("%H%M").to_i
  end

コンソールでは、start_time_amフィールドは次のようになります。

 Promotion.last.start_time_am
  => 430 

ただし、新しいフィールドを一時的に定義して、最初のフィールドを引き続き使用できるようにしたい場合。

コンソールでこれにアクセスできますが、検索時にはアクセスできません。例えば。

   def start_time_new
     read_attribute(:start_time_am).strftime("%H%M").to_i
   end

  def self.time_range
    time = Time.now.strftime('%H%M').to_i
    where("start_time_new <= ?", time)
  end

不明な列エラーが発生します。attr_readerで解決できると思いましたが、機能していません。

ありがとう

4

2 に答える 2

3

これを同等のメソッド定義として書き直すと、理解しやすくなる可能性があります。

def self.time_range
  a = DateTime.parse(start_time_am)
  where("#{a} <= ?", Time.now.strftime('%H'))
end

start_time_amはどこから来ていますか?メソッドには引数がありません。

于 2012-09-23T10:50:00.980 に答える
0

最後に、whereステートメントで変換を行い、仮想属性を削除しました。

def self.time_available
  where("cast(start_time as time) <= cast(now() as time) and cast(end_time as time) >= cast(now() as time)")
end

それが誰かを助けることを願っています

于 2012-09-24T14:55:43.787 に答える