class CreatePeople < ActiveRecord::Migration[7.0]
def change
create_table :people do |t|
t.string :name
t.string :email
t.string :fav_prog_lang
t.timestamps
end
end
end
个字符 然后,你需要创建这些模型:
# app/models/person.rb
class Person < ApplicationRecord
has_many :tasks, foreign_key: :owner_id
end
2条答案
按热度按时间4uqofj5v1#
即使您的UML模式在Rails中实现时违反了依赖倒置原则,并且违反了2NF,
但你可以这样做:
您需要创建两个表
people
和tasks
您可以通过添加以下迁移来实现这一点:
个字符
然后,你需要创建这些模型:
最后,你可以创建你的任务:
型
如果您需要能够知道什么任务是
chore
,什么任务是homework
,您需要将type
字段添加到tasks
表中,以便能够确定子任务更新:
为了避免违反依赖倒置原则,你可以做下面的事情:
将
Task
、Chore
和Homework
分隔到不同的表中,因为Chore
和Homework
具有非常不同的字段还有你的模特:
你可以像这样操作这些模型:
型
注:但是,如果您需要添加更多不同的任务,这种方法并不适合。因为您将始终拥有新的任务类型,您将不得不添加新的表。这只适用于您当前的示例。
68bkxrlz2#
字符串
我没有试过这个代码,但它应该是正确的。
Task
有一个多态的owner
,所以它可以是一个Person
,或任何其他模型,这将增加2列owner_type
和owner_id
。一个任务也有一个
type
(STI),它可以是Tasks::Chores
或Tasks::Homework
(为了清楚起见,我给它命名)。使用
Task
模型上的作用域,您应该能够调用person.tasks.chores
或person.tasks.homeworks