2011-01-15 4 views
0

У меня есть следующие две модели:Определение отношения с множественным один-к-одному отношений между двумя моделями в рельсах

class Project < ActiveRecord::Base 
has_one :start_date, :class_name => 'KeyDate', :dependent => :destroy 
has_one :end_date, :class_name => 'KeyDate', :dependent => :destroy 

и

class KeyDate < ActiveRecord::Base 
belongs_to :project 

Учитывая определенный ключ дату из базы данных связанной к проекту:

@key_date = KeyDate.find(:first) 

Есть ли способ изучить отношение, чтобы проверить, является ли параметр @key_date rel приступил к проекту как start_date или как end_date?

+0

Я не понимаю .. ключевая дата не связана с Модель проекта через ассоциацию belongs_to. Является ли: конференция, ссылающаяся на модель проекта? –

+0

Привет, Сэм, ты прав, я приклеил неправильную ассоциацию, теперь исправленную. – Topo

ответ

0

Просто думать вслух ...

class KeyDate < ActiveRecord::Base 
    belongs_to :project 

    def start_date? 
    project.start_date == self 
    end 

    def end_date? 
    project.start_date == self 
    end 

    date_type 
    [:start_date, :end_date].find {|sym| send("#{sym}?") } 
    end 
end 

Если честно, я не могу видеть зачем вам это нужно. Неужели вы все равно будете иметь ручку на проекте?

1

Хороший способ будет использовать единую таблицу наследования для KeyDate класса

class KeyDate < ActiveRecord::Base 
    belongs_to :project 
end 

class StartDate < KeyDate 
end 

class EndDate < KeyDate 
end 

class Project < ActiveRecord::Base 
    has_one :start_date, :dependent => :destroy 
    has_one :end_date, :dependent => :destroy 
end 

class CreateKeyDatesMigration < ActiveRecord::Migration 
    def up 
    create_table :key_dates do |t| 
     t.date :date 
     t.string :type #this is the magic column that activates single table inheritance 
     t.references :project 
    end 
    end 
    … 
end 

это позволяет сделать

@key_date = KeyDate.find(:first) 
@key_date.type # => "StartDate" 
+0

Привет, спасибо за помощь. Это хорошо работает. Я назвал предложение apneadiving правильным, поскольку он первым предложил решение STI. Спасибо большое. – Topo