Ruby - 两个不同对象的属性集的交集

3

I have 3 classes defined as:

Client

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

供应商

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

会议时间

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

每个MeetingTime实例都有一个日期、开始时间和结束时间。 有没有一种有效的方法来计算它们的交集?
client_instance1.meeting_times and 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 & provider_instance1.meeting_times

在种子文件中开发客户端和提供者实例后,由于不同会议时间的ID不匹配(即使日期、开始时间和结束时间相同),我得到了一个空集。如何解决这个问题?我是否有什么误解?

{btsdaf} - Daniel Westendorf
当您说“交集”时,是指时间和日期的完全相等吗?还是您想要获取部分重叠的时间? - Stanislav Mekhonoshin
@StanislavMekhonoshin 我的意思是指准确相等,例如:(ta1.day == ta2.day) && (ta1.start_time == ta2.start_time) && (ta1.end_time == ta3.end_time) - user8093919
1个回答

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}"。值-是来自客户端和提供者会议的相等会议数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接