开发者

Using ActiveRecord::Association methods where associated "child" model uses STI

I've got a super-class (model) Measurement and two sub-classes: WeightMeasurement and LengthMeasurement.

I've then got a Person class which as many WeightMeasurements and LengthMeasurements.

The issue is when creating a new measurement for a Person, I want to use a shared controller that will handle both weight and length measurements.

However, the way that I would typically build up a Person's measurements would be access them bia the parent (Person). Like person.weight_measurement.build. The problem is that I don't know what to put here... 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_measuremen开发者_运维百科ts, :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


What I normally do, is to create a hidden field in my form, which contains the type I am trying to create.

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

You could also have it as a visible form option (say a radio button or select - instead of the hidden field above)

In your controller, you can do the following then:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜