Rails与外键关联

时间:2015-10-01 07:49:49

标签: ruby-on-rails activerecord

我对这些问题感到困惑

这是项目模型

class Item < ActiveRecord::Base
  has_many :true_items, :foreign_key => "parent_id", dependent: :destroy
end

这是TrueItem模型

class TrueItem < ActiveRecord::Base
  attr_accessible :item_id, :parent_id

  belongs_to :parent, :class_name => "Item"
  belongs_to :item
end

这里采取的所有项目包括true_items

items = Item.includes(:true_items)
items.each do |item|
   item.true_items.each do | true_item |
      true_items = "#{true_item.item.name}"
   end
end

这里的问题是,当我把item.name作为&#34;#{true_item.item.name}&#34;在循环中,重复查询发生,这意味着再次调用该项获取名称。那个协会有什么问题吗?

2 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为您有两个关联,parentitem

您可以在循环中调用正确的关联:

Item.includes(:true_items).each do |item|
   item.true_items.each do |true_item|
      true_items = "#{true_item.parent.name}"
   end
end

或者您实际上只需为关联添加别名(因为itemparent实际上是相同的关联):

class TrueItem < ActiveRecord::Base
  attr_accessible :item_id, :parent_id

  belongs_to :parent, :class_name => "Item"
  alias_attribute :item, :parent
end

答案 1 :(得分:0)

#app/models/item.rb
class Item < ActiveRecord::Base
   has_and_belongs_to_many :true_items,
        class_name: "Item", 
        join_table: :true_items, 
        foreign_key: :item_id, 
        association_foreign_key: :true_item_id
end

Reference

这将允许您拨打以下电话:

<% @items = Item.all %>
<% @items.each do |item| %> 
   <% item.true_items.each do |true_item| %>
      <%= true_item.name %>
   <% end %>
<% end %>

您甚至可以保留true_items表格(您可能需要移除idcreated_atupdated_at字段。