0

スーパークラス (モデル) Measurement と、WeightMeasurement と LengthMeasurement の 2 つのサブクラスがあります。

次に、WeightMeasurements と LengthMeasurements と同じ数の Person クラスを取得しました。

問題は、人の新しい測定値を作成するときに、重量と長さの両方の測定値を処理する共有コントローラーを使用したいということです。

ただし、私が一般的に Person の測定値を構築する方法は、親 (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 に答える