繁体   English   中英

ActiveRecord has_one关系与has_many关系

[英]ActiveRecord has_one relationship alongside a has_many relationship

我正在努力与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类中对此进行描述

似乎最好使用属性而不是创建单独的ID。 也许您的任务可能有一个名为active的布尔列,那么可以通过以下命令找到计划的活动任务:

@schedule.tasks.select {|t|t.active?}

或者,您可以创建命名范围来完成相同的事情。

应该看起来像这样

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 (在许多情况下为nil),您可能大多希望在代码中使用schedule.active_task

'relevant_schedule'只是一个任意名称,您可以选择其他任何喜欢的名称。 :class_name和:foreign_key必须与数据库和模型名称完全匹配。 也许可以完全省略“ relevant_schedule”定义。 我不确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM