Question

Je me demandais si quelqu'un pouvait jeter un coup d'œil à ce sujet. Je fais une simple application de conversion qui convertit entre les unités de mesure. Je dois être en mesure d'auto référence à la table à l'aide d'une table de jointure qui stocke la relation entre chaque, ainsi que la conversion entre chaque. Ce serait alors référencé entre chaque côté de la relation. Par exemple 1cm = 10 mm et 10 mm = 1 cm.

Alors, jusqu'ici j'ai ceci:

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

Pour la plupart cela fonctionne bien. Sauf que je ne peux pas accéder au nom de la mesure concernée, seul le propriétaire.

Je dois l'obtenir en quelque sorte comme ceci:

f_r_m.object.related_measure.name

mais il est clair, malgré mes efforts, je ne peux pas le mettre en place et recevoir l'erreur.

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

L'aide serait très apprécié. :)

Était-ce utile?

La solution

À première vue, le problème vient de la définition a beaucoup à travers. En omettant de définir la clé étrangère, Rails, Suppose measure_id dans la table de jointure. Ce qui serait tout simplement un lien vers la mesure que vous essayez de le trouver à partir.

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

Nous ne pouvons pas diagnostiquer cette erreur sans voir les entrailles du modèle rejoindre.

f_r_m.object.related_measure fait référence à une table de jointure.

Mais je pense qu'il est parce que vous n'avez pas défini la relation correctement dans le joint modèle. Ce qui devrait ressembler à ceci:

class MeasureMeasures < ActiveRecord::Base
    belongs_to :measure
    belongs_to :related_measure, :classname => "Measure"
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top