ActiveRecord与has_many关系有一对一的关系

时间:2010-08-30 09:55:53

标签: ruby-on-rails activerecord associations

我正在努力模拟与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类中描述这个

2 个答案:

答案 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'定义。我不确定。