Ruby - 从子级访问父属性 - 一对多关系

时间:2015-04-27 13:43:19

标签: ruby-on-rails

class PriceList < ActiveRecord::Base
  has_many :prices, :dependent => :destroy
end

和价格:

class Price < ActiveRecord::Base
  belongs_to :price_list
  belongs_to :material
  belongs_to :unit
end

现在在price_list索引中我想显示价格表名称而不是id:

<tbody>
    <% @prices.each do |price| %>
      <tr>
        <td><%= price.price_list.price_list_short_name %></td>
        <td><%= price.materials_id %></td>
        <td><%= price.units_id %></td>
        <td><%= link_to 'Show', price %></td>
        <td><%= link_to 'Edit', edit_price_path(price) %></td>
        <td><%= link_to 'Destroy', price, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

price.price_list.price_list_short_name不起作用我做错了什么?

2 个答案:

答案 0 :(得分:1)

至少有一条Price条记录与price_list相关联。解决方案取决于您的意图。如果您想强制所有prices拥有price_list,您可以添加验证:

class Price < ActiveRecord::Base
  validates :price_list, presence: true
  # ...
end

如果您想允许price_list-less prices,您可以使用try方法,这将修复视图中的错误:

price.price_list.try(:price_list_short_name)

BTW,在price_list_short_name表中命名列price_lists有点多余。

答案 1 :(得分:0)

我错过了正确的引用。 添加到迁移文件:

class AddReferencesToPrices < ActiveRecord::Migration
  def change
    remove_column :prices, :price_list_id
    remove_column :prices, :materials_id
    remove_column :prices, :units_id
    add_reference :prices, :price_list, :index => true
    add_reference :prices, :material, :index => true
    add_reference :prices, :unit, :index => true
  end
end

解决了问题。