0

我有一个超类(模型)Measurement 和两个子类:WeightMeasurement 和 LengthMeasurement。

然后我得到了一个 Person 类,其中包含许多 WeightMeasurements 和 LengthMeasurements。

问题是在为 Person 创建新测量时,我想使用一个共享控制器来处理重量和长度测量。

但是,我通常建立一个人的测量值的方式是从父级(人)访问它们。就像 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
4

1 回答 1

0

我通常做的是在我的表单中创建一个隐藏字段,其中包含我要创建的类型。

<%= hidden_field_tag :type, "weight_measurement" %>

您也可以将其作为可见表单选项(例如单选按钮或选择 - 而不是上面的隐藏字段)

在您的控制器中,您可以执行以下操作:

if ["length_measurement", "weight_measurement"].include?(params[:type])
  @measurement = "Measurement::#{params[:type].classify}".constantize.new(:person => @person)
end
于 2011-11-09T08:56:58.353 回答