2016-08-10 15 views
0

重複をチェックする検証を作成しようとしています。時間の重複を確認する

scope :overlapping_activity, ->(activity) { where("(start_on, end_on) OVERLAPS (?, ?)", 
               activity.start_on, activity.end_on } 
    validate :not_overlapping_activity 

    def not_overlapping_activity 
    if Activity.overlapping_activity(self).any? 
     errors.add(:base, "Zajęcie w tym okresie koliduje z innymi.") 
    end 
    end 

エラー:

ERROR: function pg_catalog.overlaps(time without time zone, time without time zone, unknown, unknown) is not unique 
LINE 1: ...NT(*) FROM "activities" WHERE ((start_on, end_on) OVERLAPS (... 

私はこのトピックを見つけました:Rails 3.1: Querying Postgres for records within a time range、私は私の解決策でそれを使用することはできません。スコープ内にタイムスタンプを追加しようとすると、別の構文エラーが表示されます。誰かが私の問題を適切に解決する方法を教えてもらえますか?

scope :overlapping_activity, ->(activity) { where("(start_on::timestamp, end_on::timestamp) OVERLAPS (?, ?)", 
               timestamp activity.start_on, timestamp activity.end_on) } 
+2

あなたは 'スコープ:overlapping_activity、 - >(アクティビティ){ここで("(start_on :: timestamp、end_on :: timestamp)OVERLAPS(timestamp:start_on、timestamp:end_on ) "、:start_on => activity.start_on、:end_on => activity.end_on)}'? –

+0

@IVOGELOVこれはエラーです: 'エラー:タイムゾーンを持たないタイプタイムアウトをタイムゾーンなしのタイムスタンプにキャストできません ' –

+0

' activity.start_on'と 'activity.end_on'に日付だけでなく時刻も含まれていますか? –

答えて

1

私はこの方法で何を望むか達成:

validate :not_overlapping_activity 

    def not_overlapping_activity 
     overlapping_activity = Activity.where(day_of_week: day_of_week) 
            .where(pool_zone: pool_zone) 
     overlapping_activity.each do |oa| 
     if (start_on...end_on).overlaps?(oa.start_on...oa.end_on) 
      errors.add(:base, 'In this period of time there is some activity.') 
     end 
     end 
    end 

誰かがよりよい解決策がある場合は記入してください、私が使用タイムスタンプを試してみましたどのように

。私はより良い、より巧みになりたいです:)

関連する問題