代码之家  ›  专栏  ›  技术社区  ›  mark

ror self-referential通过接受嵌套的属性

  •  1
  • mark  · 技术社区  · 16 年前

    我想知道是否有人能快速地看看这个。我正在制作一个简单的转换应用程序,它可以在测量单位之间转换。我需要能够使用一个连接表自引用该表,该表存储了每个表之间的关系以及每个表之间的转换。这将在关系的任何一方之间被引用。例如,1cm=10 mm和10 mm=1cm。

    到目前为止,我有:

    #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 回复  |  直到 16 年前
        1
  •  0
  •   EmFi    16 年前

    乍一看,问题来自于“有多个”的定义。由于未能定义外键rails,因此在join表中假定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