Ruby - 两个集合的交集,它们是两个不同对象的属性

时间:2017-10-25 16:17:14

标签: ruby-on-rails ruby activerecord

我有3个类定义为:

客户端

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的每个实例都有一天,start_time和end_time。 有没有办法让我有效地计算

的交集
client_instance1.meeting_times and provider_instance1.meeting_times

在我的种子文件中,我为客户端和提供者创建了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不匹配(即使day,start_time和end_time相同)。 我该如何解决这个问题?我误会了什么吗?

1 个答案:

答案 0 :(得分: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

但请遵循这种方法,请注意,它只返回client_instance1次会议,这些会议在provider_instance1次会议中具有相同的日期/时间。

更聪明的方法 - 构建一个哈希,其中键将是字符串的校验和,如:"#{day}#{start_time}#{end_time}"。 价值观 - 是来自客户和提供者会议的平等会议阵列。