2016-08-05 22 views
0

と重なります特定の日時(start_on、end_on)で行われる1つのアクティビティに参加できます。私が他の練習に参加する前に(同じ日付と時間が重なる)別のアクティビティにサインアップしようとすると、エラーが発生します。 は私がしようと何:問題は、2つのモデルがあります

def check_join_client 
    activities_date = person.activities_people.where('date = date', date: date) 
    if activities_date.exists && person.activities.where('id IN (?)', activities_date) 
    end 

私はactivies_peopleと関係者の活動を取得する(person.activities.where ...)クエリの作成に使用する方法がわかりません。 activities_date同じ日に行われたアクティビティに参加したかどうかを確認します。 2番目は、start_onとend_onのチェックを受けたい。 ありがとうございます。

+0

「どこで」配列を提供するのが簡単な方法です:すなわち、 'User.where(id:[1,2,3])' –

+0

@maxpleaner ok私は理解しますが、person.activities id(アクティビティid not person)がinactivities_date resultですか? –

答えて

1

私が正しくあなたを理解していた場合は、日付の配列によってクエリに一致するユーザーのためのactivites_peopleを見つけ、その後上げたいです関連するものがactivities_peopleと一致する場合には、activityが含まれていなければエラーとなります。

check_join_clientのためのあなたの元のコードはif間違って使用します。

def check_join_client 
    activities_date = person.activities_people.where('date = date', date: date) 
    if activities_date.exists && person.activities.where('id IN (?)', activities_date) 
    end 

が擬似コードにこれを翻訳するには、基本的に言っている:

result = query if result.condition_met? 

しかしif条件(if後の式) resultsを定義する前に評価されます。正しいアプローチを示すと、より明確になる可能性があります。

result = query return result if result.condition_met?

今、このような何かしようと、ロード関連したレコードについて、あなたの質問に戻ります:

activities_people_ids_matching_date = person.activities_people 
               .where(date: self.date) 
               .pluck(:id) 
    # use pluck to get an array of ids because that's all that's needed here 
    # not sure how you're getting the date variable, so I'm assuming self.date will work 
    # I can use `.any?` to see if the ids list is not empty. 
    condition_met = activities_people_ids_matching_date.any? &&\ 
        person.activities 
         .where(activities_people_id: activities_people_ids_matching_date) 
         .any? 
    condition_met ? true : raise(StandardError, "my error") 

確かに、これは代わりに、二つのうちの一つのクエリで終らせる方法があるが、それはあなたどこのように思えますRubyの概念では、SQL最適化よりも構文やコア機能に重点を置くことが重要です。

+0

同じ日に別のアクティビティに参加できないので、正しくはありません。我々はまた時間をチェックすべきです.E.G.最初のアクティビティ:05.08.2016 8:00 - 9:00 2番目のアクティビティ:05.08.2016 9:00 - 10:00 - 正しい。第2回05.08.2016 8:00 - 9:00、05.08.2016 8:30 - 9:30 - 間違っています。 –

+0

実際にはっきりしない...クエリで時間の範囲を使用しようとしていますか?つまり、午前9時から午前10時までですか? –

+0

このように: '((start_on <=:start_onとend_on> =:end_on)OR(start_on <=:start_onとend_on <=:end_on ...) ' –

0

正しい構文(いくつかのオプションの1つ)です:

person.activities_people.where(date: date) 
+0

あなたのコードは結果をスローしません。しかし、私が現在の人物 'person.activities_people.where(person_id:2)'をチェックすると、同じ日付の2人のactivity_people ... –