我有几个模型是多个对象的复合体。我基本上手动管理它们以进行保存和更新。但是,当我选择项目时,我无权访问所述项目的相关属性。例如:
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
答案 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...
我不确定你在问什么...如果这不能回答你所问的问题,那么你能不能更清楚地知道你想要完成什么? Chassis
和Engine
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
模型上设置正确的关联,那么你不需要去尝试手动处理关联就像你试图在这里做的那样。