2010-08-30 3 views
0

Я изо всех сил пытаюсь моделировать определенные отношения с ActiveRecord. Я в настоящее время имеют следующие настройки и работыActiveRecord has_one отношения наряду с отношениями has_many

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 классов

ответ

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 в своем коде.

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

+0

Это замечательно. Спасибо за вашу помощь – Dative

0

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

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

Или ваш может создать именованный простор сделать то же самое.

+0

Это был мой план-б. Похоже, я тоже должен был читать по названным областям. Благодарю. – Dative

Смежные вопросы