我正在努力模拟与ActiveRecord的特定关系。我目前有以下设置和工作
class Schedule < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord:Base
belongs_to :schedule
end
具有如下所示的数据库结构:
schedules
- integer:id
tasks
- integer:id
- integer:schedule_id
我希望能够做的是通过在Schedules表中添加“active_task_id”列,将其中一个任务设置为计划的活动任务:
schedules
- integer:id
- integer:active_task_id
tasks
- integer:id
- integer:schedule_id
我正在努力解决的是我应该如何在ActiveRecord类中描述这个
答案 0 :(得分:0)
看起来您最好使用属性而不是创建单独的ID。也许您的任务可能有一个名为active
的布尔列,然后可以找到计划的活动任务:
@schedule.tasks.select {|t|t.active?}
或者你可以创建命名范围来完成同样的事情。
答案 1 :(得分:0)
应该是这样的
class Schedule < ActiveRecord::Base
has_many :tasks
belongs_to :active_task,
:class_name => 'Task',
:foreign_key => 'active_task_id'
end
class Task < ActiveRecord:Base
belongs_to :schedule
has_one :relevant_schedule,
:class_name => 'Schedule',
:foreign_key => 'active_task_id'
end
概念上棘手的部分是定义'relevant_schedule'关系。这在大多数情况下并不是真的需要(即不会被你编写的代码使用),这是ORM强制性所必需的。
你不太可能想要使用task.relevant_schedule
(在很多情况下它会是零),你可能最想在你的代码中使用schedule.active_task
。
'relevant_schedule'只是一个任意名称,您可以选择您喜欢的任何其他名称。 :class_name和:foreign_key必须与数据库和模型名称完全匹配。或许可以完全省略'relevant_schedule'定义。我不确定。