2017-10-25 3 views
3

の属性である2つのコレクションの交差点:ルビー私は3つのクラスとして定義されている2つの異なるオブジェクト

クライアント

class Client < ActiveRecord::Base 
    belongs_to :provider 
    has_many :meeting_times 
end 

プロバイダ

class Provider < ActiveRecord::Base 
    has_many :clients 
    has_many :meeting_times 
end 

MeetingTimeの

class MeetingTime < ActiveRecord::Base 
    belongs_to :meetingable, polymorphic: true 
end 

各インスタンスMeetingTimeのeにstart_timeとend_timeの日があります。私は

client_instance1.meeting_times & provider_instance1.meeting_times 
をしようとすると、

client_instance1.meeting_times.build(:day => "Friday", :start_time => time1, :end_time => time2) 
client_instance1.meeting_times.build(:day => "Saturday", :start_time => time3, :end_time => time4) 
client_instance1.save! 

現在、次のように 私は効率的に私のシードファイルで

client_instance1.meeting_times and provider_instance1.meeting_times 

の交点を計算するための方法がありますが、私はクライアントとプロバイダーのためのmeeting_timesを作成します

シードファイルでクライアントインスタンスとプロバイダインスタンスを開発した後、異なる会議時間のIDが一致しないため空のセットが返されます(たとえt彼の日、start_timeとend_timeは同じです)。 どうすればこの問題を解決できますか?私は何かを誤解していますか?

+0

おそらくSQLサブクエリでこれを行うでしょう。私は、あなたが答えを探し始めることをお勧めします。 –

+0

「交差点」と言うと、時間と日の正確な平等を意味しますか?または時間の部分的なオーバーラップを取得したいですか? –

+0

@StanislavMekhonoshin私は単に、正確な平等を意味します。すなわち、 (ta1.day == ta2.day)&&(ta1.start_time == ta2.start_time)&&(ta1.end_time == ta3.end_time) – user8093919

答えて

0

私はあなたが行うことができると信じて:

intersections = client_instance1.meeting_times.reduce([]) do |result, client_meeting| 
    intersects = provider_instance1.meeting_times.any? { |provider_meeting| provider_meeting.day == client_meeting.day && provider_meeting.start_time == client_meeting.start_time && provider_meeting.end_time == client_meeting.end_time } 
    result << obj if intersects 
    result 
end 

しかし、このアプローチを、以下、覚えておいて、それはprovider_instance1会議で同等の日付/時間を持っているだけclient_instance1会議に、戻ります。

よりスマートなアプローチ - 鍵が"#{day}#{start_time}#{end_time}"のような文字列のチェックサムになるハッシュを構築することです。 値は、クライアント会議とプロバイダ会議の両方から、等しい会議の配列です。

関連する問題