ActiveRecord имеет отношение has_one наряду с отношением has_many - PullRequest
0 голосов
/ 30 августа 2010

Я изо всех сил пытаюсь смоделировать определенные отношения с 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

То, что я хотел бы сделать, это установить один иззадачи, чтобы быть активной задачей для расписания, добавив столбец "active_task_id" в таблицу расписаний:

schedules
  - integer:id
  - integer:active_task_id

tasks
  - integer:id
  - integer:schedule_id

Я борюсь с тем, как я должен описать это в моих классах ActiveRecord

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

должно выглядеть следующим образом

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 

концептуально сложная часть определяет отношение 'related_schedule'.в большинстве случаев это не нужно (то есть не будет использоваться кодом, который вы пишете), это необходимо для полноты ORM.

маловероятно, что вы когда-либо захотите использовать task.relevant_schedule (во многихв противном случае это будет ноль), вы, вероятно, в основном захотите использовать schedule.active_task в своем коде.

'related_schedule' - это произвольное имя, вы можете выбрать любое другое имя, которое вам нравится: class_name и: foreign_key должны точно совпадать с именами базы данных и модели.возможно, определение 'релевантного_складания' может быть вообще опущено.я не уверен.

0 голосов
/ 30 августа 2010

Кажется, вам лучше использовать атрибут, а не создавать отдельный идентификатор. Возможно, у вашей задачи может быть логический столбец с именем active, тогда активную задачу для расписания можно найти с помощью:

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

Или вы можете создать именованную область видимости, чтобы выполнить то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...