在我的程序中,我有乘客、司机和首选项表。
每个骑手和车主都有自己的一套其他车型的排名偏好。(例如。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
可以属于Driver
或Rider
,我认为多态关联是最好的。
偏好表格计划为一个表格,其中包含所有乘客和合作车主的所有偏好。
一切似乎都很好,除了每个首选项都需要指向一个特定的person
。
但我对如何最好地做到这一点感到困惑。看来person
必须是骑手或车手。所以这似乎是另一个多态关联。
除了,在Preference
中添加一些东西,比如belongs_to :person, polymorphic: true
让我想知道,我会在Rider
和Driver
中放下什么样的各自关系?就像has_one
或has_many
对我来说似乎不太有意义。
这是我打算实现的功能:
- 所有乘客或合作车主都应该有偏好,每个偏好都应该指向特定的人(相反的类型)。
- 首选项应该是双向的。如果乘客的状态发生变化,则每位合作车主的偏好设置中,该乘客将及时了解这些变化
- 获取合作车主或乘客偏好设置,并查看有关特定首选实体的当前属性。
- 例如查看驾驶员的首选项,并检查他们的第一个首选项是否已经有驱动程序(类似于
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
都有一个preferrer
和preferable
,这两个属性可以是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
对每个人的偏好进行排序(这只是一个小的爱好项目)。