私が正しくあなたを理解していた場合は、日付の配列によってクエリに一致するユーザーのための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最適化よりも構文やコア機能に重点を置くことが重要です。
「どこで」配列を提供するのが簡単な方法です:すなわち、 'User.where(id:[1,2,3])' –
@maxpleaner ok私は理解しますが、person.activities id(アクティビティid not person)がinactivities_date resultですか? –