Использование методов ActiveRecord :: Association, где связанная «дочерняя» модель использует STI - PullRequest
0 голосов
/ 01 мая 2011

У меня есть Измерение суперкласса (модели) и два подкласса: WeightMeasurement и LengthMeasurement.

Затем у меня есть класс Person, который имеет столько же WeightMeasurements и LengthMeasurements.

Проблема в том, что при создании нового измерения для Человека я хочу использовать общий контроллер, который будет обрабатывать измерения как веса, так и длины.

Однако способ, которым я обычно строю измерения Человека, будетбыть доступным для них через родителя (человека).Как person.weight_measurement.build.Проблема в том, что я не знаю, что здесь поставить ... person..build?

# Base-model, includes "type" column in database.
class Measurement < ActiveRecord::Base
    belongs_to :person
end

# model subclass
class WeightMeasurement < Measurement
end

# model subclass
class LengthMeasurement < Measurement
end


class Parent < ActiveRecord::Base
    has_many :weight_measurements, :dependent => :destroy
    has_many :length_measurements, :dependent => :destroy
end

# Single controller for "Measurements"
class MeasurementsController < ApplicationController

  ...

  def new

    person = Person.find(params[:person_id])

    # 
    normally would do this, but because I am using STI,
    # I don't know that it is a Person's "weight" measurement we are creating
    #
    # @measurement = @person.weight_measurements.build
    #

    ...

  end

...

end

1 Ответ

0 голосов
/ 09 ноября 2011

Что я обычно делаю, это создаю скрытое поле в моей форме, которое содержит тип, который я пытаюсь создать.переключатель или выберите - вместо скрытого поля выше)

В вашем контроллере вы можете сделать следующее:

if ["length_measurement", "weight_measurement"].include?(params[:type])
  @measurement = "Measurement::#{params[:type].classify}".constantize.new(:person => @person)
end
...