轨道多重多态关联?



在我的程序中,我有乘客、司机和首选项表。

每个骑手和车主都有自己的一套其他车型的排名偏好。(例如。Rider1有偏好[Driver1, Driver2, Driver3]按该顺序)

class Rider
has_many :preferences, as: :preferable -> { order(position: :asc) }
# has other stuff like a rider's current driver (if they have one), etc.
end
class Driver
has_many :preferences, as: :preferable -> { order(position: :asc) }
# other things like a driver's car (and current passengers)
end
class Preference
belongs_to :preferable, polymorphic: true
# tbd what to put here
end

因为Preference可以属于DriverRider,我认为多态关联是最好的。

偏好表格计划为一个表格,其中包含所有乘客和合作车主的所有偏好。

一切似乎都很好,除了每个首选项都需要指向一个特定的person

但我对如何最好地做到这一点感到困惑。看来person必须是骑手或车手。所以这似乎是另一个多态关联。

除了,在Preference中添加一些东西,比如belongs_to :person, polymorphic: true让我想知道,我会在RiderDriver中放下什么样的各自关系?就像has_onehas_many对我来说似乎不太有意义。

这是我打算实现的功能:

  1. 所有乘客或合作车主都应该有偏好,每个偏好都应该指向特定的人(相反的类型)。
  2. 首选项应该是双向的。如果乘客的状态发生变化,则每位合作车主的偏好设置中,该乘客将及时了解这些变化
  3. 获取合作车主或乘客偏好设置,并查看有关特定首选实体的当前属性。
  • 例如查看驾驶员的首选项,并检查他们的第一个首选项是否已经有驱动程序(类似于rider1.is_taken?)

我想象播种是这样的(轻微的伪代码):


max = Rider.create!( 
name: "Max",
address: "Pike Place Market"
)
jacob = Driver.create!(
name: "Jacob",
address: "Seattle",
total_space: 3
)
leo = Driver.create!(
name: "Leo",
address: "New York",
total_space: 1
)
# This would create preferences [Jacob, Leo] for Max 
# such that he'd prefer Jacob over Max.
Preference.create!(
preferable: max,
person: jacob
);
Preference.create!(
preferable: max,
person: leo
);

关于如何处理乘客/合作车主偏好的任何想法?是另一个多态关联吗?如果是这样,那么除了Preference之外,我应该在其他模型中放什么?

也许我也以一种糟糕的方式构建了这个,如果是这样的话,我绝对愿意听到不同的想法。

好吧,事实证明多态关联确实奏效了!

每个Preference都有一个preferrerpreferable,这两个属性可以是Rider,也可以是Driver

class Preference < ApplicationRecord
belongs_to :preferrer, polymorphic: true, required: true
belongs_to :preferable, polymorphic: true, required: true
end

Rider创建Preference将如下所示:


someRider = Rider.create!(...)
someDriver = Driver.create!(...)
Preference.create!(
preferrer: someRider,
preferable: someDriver
)

然后我选择按created_at对每个人的偏好进行排序(这只是一个小的爱好项目)。

相关内容

  • 没有找到相关文章

最新更新