На каком уровне в объекте модели ActiveRecord не загружает связанные объекты - PullRequest
0 голосов
/ 10 марта 2012

У меня есть пара моделей, которые являются составной частью нескольких объектов. Я в основном управляю ими вручную для сохранения и обновления. Однако, когда я выбираю элементы, у меня нет доступа к связанным свойствам указанного элемента. Например:

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) в большинстве других ситуаций, я делаю.

Я пытался использовать include, но, похоже, этого не произошло.

ТНХ

1 Ответ

1 голос
/ 10 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...