Выявление взаимосвязей с несколькими однозначными взаимосвязями между двумя моделями в рельсах. - PullRequest
0 голосов
/ 15 января 2011

У меня есть две следующие модели:

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 с проектом как start_date или как end_date?

Ответы [ 3 ]

1 голос
/ 16 января 2011

Хороший способ будет использовать наследование одной таблицы для 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 голосов
/ 16 января 2011

Просто мысли вслух ...

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

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

0 голосов
/ 15 января 2011

Один простой способ сделать то, что вы хотите, это создать STI:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

Смотрите один пример, который я привел здесь:

Rails devise addполя для регистрации при наличии ИППП

...