Звучит так, что самым простым решением было бы добавить методы к вашей 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
модель для начала, тогда вам не нужно идти и пытаться обрабатывать ассоциации вручную, как вы пытаетесь сделать здесь.