在模型对象的什么级别,ActiveRecord不加载关联的对象

时间:2012-03-09 20:37:57

标签: ruby-on-rails activerecord ruby-on-rails-3.1

我有几个模型是多个对象的复合体。我基本上手动管理它们以进行保存和更新。但是,当我选择项目时,我无权访问所述项目的相关属性。例如:

class ObjectConnection < ActiveRecord::Base
  def self.get_three_by_location_id location_id
    l=ObjectConnection.find_all_by_location_id(location_id).first(3)
    r=[]
    l.each_with_index do |value, key|
      value[:engine_item]=Item.find(value.engine_id)
      value[:chassis_item]=Item.find(value.chassis_id)
      r << value
    end
    return r
  end
end

和每个项目:

class Item < ActiveRecord::Base
  has_many :assets, :as => :assetable, :dependent => :destroy

当我使用ObjectLocation.find_three_by_location_id时,我无法访问资产,而如果在大多数其他情况下使用Item.find(id),我会这样做。

我尝试使用包含,但似乎没有这样做。

THX

1 个答案:

答案 0 :(得分:1)

听起来最简单的解决方案是将方法添加到ObjectConnection模型中,以便轻松访问:

class ObjectConnection < ActiveRecord::Base

  def engine
    Engine.find(engine_id)
  end

  def chassis
    Chassis.find(chassis_id)
  end

  # rest of class omitted...

我不确定你在问什么...如果这不能回答你所问的问题,那么你能不能更清楚地知道你想要完成什么? ChassisEngine mdoels是否应与您的Item模型建立多态关联?

此外,由于您尝试在模型上动态设置属性,因此上面使用的代码将无法运行。这不是您拨打Item.find失败的电话,而是您对value[:engine_item]=value[:chassis_item]的调用失败。如果你想保持这种流程,你需要将它修改为类似的东西:

def self.get_three_by_location_id location_id
  l=ObjectConnection.find_all_by_location_id(location_id).first(3)
  r=[]
  l.each_with_index do |obj_conn, key|
    # at this point, obj_conn is an ActiveRecord object class, you can't dynamically set attributes on it at this point
    value = obj_conn.attributes # returns the attributes of the ObjectConnection as a hash where you can then add additional key/value pairs like on the next 2 lines
    value[:engine_item]=Item.find(value.engine_id)
    value[:chassis_item]=Item.find(value.chassis_id)
    r << value
  end
  r
end

但我仍然认为这整个方法似乎没有必要,因为如果你在ObjectConnection模型上设置正确的关联,那么你不需要去尝试手动处理关联就像你试图在这里做的那样。