ROR Самостоятельная ссылка has_many через accept_nested_attributes_for - PullRequest
1 голос
/ 18 ноября 2009

Интересно, может ли кто-нибудь взглянуть на это? Я делаю простое приложение для преобразования, которое конвертирует единицы измерения. Мне нужно иметь возможность самостоятельно ссылаться на таблицу, используя таблицу соединений, в которой хранятся отношения между ними, а также преобразование между ними. Тогда это будет упомянуто между любой стороной отношений. Например, 1 см = 10 мм и 10 мм = 1 см.

Пока у меня есть это:

#migrations
create_table :measures do |t|
    t.string :name
end

create_table :measure_measures do |t|
    t.integer :measure_id
    t.integer :related_measure_id
    t.integer :conversion
end

class Measure < ActiveRecord::Base    

    has_many :related_measures,  
        :foreign_key => 'measure_id',
        :class_name => 'MeasureMeasure',
        :dependent => :destroy

    has_many :measures,  :through => :related_measures

    accepts_nested_attributes_for :related_measures, 
        :reject_if => proc { |attrs| attrs['related_measure_id'].blank? ||  
                                     attrs['quantity'].blank? }, 
        :allow_destroy => true      
end

#controller
    @measure = Measure.find params[:id

#form
    <% form_for @measure do |f| %>
        <% fields_for :related_measures do |f_r_m| %>
            <%= f_r_m.text_field :related_measure_id -%>
            <%= f_r_m.text_field :quantity -%>
        <% end %>
    <% end %>

По большей части это работает нормально. За исключением того, что я не могу получить доступ к названию связанной меры, только владелец.

Мне нужно получить это как-то так:

f_r_m.object.related_measure.name

но, несмотря на все мои усилия, я не могу настроить его и получить ошибку.

undefined method `owner_measure' for #<MeasureMeasure:0x1053139a8> 

Помощь была бы очень признательна. :)

1 Ответ

0 голосов
/ 18 ноября 2009

На первый взгляд проблема возникает из-за множества. Не определяя внешний ключ, Rails предполагает measure_id в таблице соединений. Который просто связал бы назад с мерой, из которой вы пытаетесь найти его.

has_many :measures,  :through => :related_measures, :foreign_key => :related_measure_id

Мы не можем диагностировать эту ошибку, не увидев внутренности модели соединения.

f_r_m.object.related_measure относится к соединительной таблице.

Но я подозреваю, что это потому, что вы не определили отношения должным образом в модели соединения. Который должен выглядеть примерно так:

class MeasureMeasures < ActiveRecord::Base
    belongs_to :measure
    belongs_to :related_measure, :classname => "Measure"
end
...