Pergunta

Eu me perguntei se alguém poderia dar uma rápida olhada nisso. Estou fazendo um aplicativo de conversão simples que converte entre unidades de medição. Preciso ser capaz de se auto -referir a tabela usando uma tabela de junção que armazena a relação entre cada uma, juntamente com a conversão entre cada uma. Isso então seria referenciado entre ambos os lados do relacionamento. Por exemplo, 1cm = 10mm e 10mm = 1cm.

Então, até agora eu tenho isso:

#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 %>

Na maioria das vezes, isso funciona bem. Exceto que não posso acessar o nome da medida relacionada, apenas o proprietário.

Eu preciso conseguir de alguma forma assim:

f_r_m.object.related_measure.name

Mas claramente, apesar dos meus melhores esforços, não posso configurá -lo e receber o erro.

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

A ajuda seria muito apreciada. :)

Foi útil?

Solução

À primeira vista, o problema vem da definição de muitos temas. Ao não definir a chave estrangeira, os trilhos assumem medir_id na tabela de junção. O que apenas se vincularia à medida que você está tentando encontrá -la.

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

Não podemos diagnosticar esse erro sem ver as entranhas do modelo de junção.

f_r_m.object.related_measure refere -se a ingressar na mesa.

Mas eu suspeito que é porque você não definiu o relacionamento corretamente no modelo de junção. O que deve parecer algo assim:

class MeasureMeasures < ActiveRecord::Base
    belongs_to :measure
    belongs_to :related_measure, :classname => "Measure"
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top