ruby-on-rails - Rails 多个多态关联?
问题描述
在我的程序中,我有表格 Riders、Drivers 和 Preferences。
每个 Rider 和 Driver 都有自己的一组对其他模型的排名偏好。(例如,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
因为 aPreference
可以属于 a Driver
or Rider
,所以我认为多态关联是最好的。
Preferences 表计划为一个单一的表,将包含所有骑手和司机的所有偏好。
除了每个 Preference 需要指向一个特定的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
andpreferable
两个属性可以是 aRider
或Driver
。
class Preference < ApplicationRecord
belongs_to :preferrer, polymorphic: true, required: true
belongs_to :preferable, polymorphic: true, required: true
end
Preference
为 a创建一个Rider
将是这样的:
someRider = Rider.create!(...)
someDriver = Driver.create!(...)
Preference.create!(
preferrer: someRider,
preferable: someDriver
)
然后我选择按顺序排列每个人的偏好created_at
(这只是一个小爱好项目)。
推荐阅读
- python - 具有多个迭代器的 Python 多处理部分池
- python - 限制 Windows 中的 python 脚本 RAM 使用
- ruby-on-rails - 更好的替代尝试方法
- mysql - SQL 事务语句在 Xampp 中不起作用
- mysql - 石英调度器启动较晚
- reactjs - React App 的 Prod 构建允许 React 开发工具并在浏览器的源选项卡中显示组件
- mongodb - MongoDB在数组中找到匹配条件的第一个元素
- c++ - 模板化 using 不能嵌套在 Visual Studio 中
- java - 大型开关盒(60 种不同的盒) - 如何减少?或细化代码
- angular - 推送到 FormArray 不会更新 mat-table