2016-04-14 16 views
1

私は2つのフィールドを持つ二つのモデルRailsの営業時間アクティブレコードのクエリ

OfficeTimeing < ActiveRecord::Base 
    belongs_to :office 
end 


Office < ActiveRecord::Base 
    has_many :office_timings 
end 

がopening_timeているとclosing_timeこれらのフィールドは、「9時00分AM」のような文字列の値は、私は、現在開いている所を見つけることができますどのようにクエリをしたい持っています私はこのようなものが欲しい。

Office.joins(:office_timings).where("Datetime.now > office_timings.opening_time AND office_timings.closing_time > DateTime.now") 
+1

私は最初のレールでそれらを解析できずに文字列として表される2つの時間を比較する方法がわからない、しかし、あなたはむしろ(深夜から数えて)秒であなたの開閉回数を保存すると考えられています文字列よりも?そうすれば、このクエリを簡単に書くことができます。 – hypern

+1

答えにあなたのコメントを貼り付けることができますこれを受け入れるでしょう –

答えて

2

私はせずに文字列として表される2つの時間を比較する方法がわかりません最初にレールでそれらを解析することができますが、文字列ではなく、夜間から数えて秒単位で開閉時間を格納することを検討しましたか?そうすれば、このクエリを簡単に書くことができます。

更新:これを達成するためのいくつかの便利な方法。

seconds = specific_time.seconds_since_midnight 

Timeオブジェクトに午前0時からの秒を変換するには:

time_instance = Time.at(seconds) 

09の形式で文字列を作成するには、特定の時間のために午前0時から現在の秒を取得するために

:00 AM

time_instance.strftime("%I:%M %p") 

Details about Time class.

Details about strftime.

+0

感謝しました –

1

あなたが?を使用して、クエリにDatetime.nowを注入する必要があります。

Office.joins(:office_timings) 
    .where(
    "? > office_timings.opening_time AND office_timings.closing_time > ?", 
    Datetime.now, Datetime.now 
) 

?は安全にクエリ文字列は、次の引数で置き換えられます。

またnow()を使用してのPostgresで直接この操作を行うと、BETWEENを使用して読むことが条件が少し楽にできます。

.where("now() BETWEEN office_timings.opening_time AND office_timings.closing_time") 
関連する問題