Попытка получить значение из таблицы соединений и ассоциации DataMapper - PullRequest
1 голос
/ 05 октября 2010

У меня есть 3 класса - Mix, MixClip и Clip.

class Mix

  include DataMapper::Resource

  property :id, Serial
  # <removed other code for brevity>

  has n, :mix_clips
  has n, :clips, :through => :mix_clips

end

class MixClip
  include DataMapper::Resource

  property :id, Serial
  property :order, Integer      

  belongs_to :mix
  belongs_to :clip
end

class Clip
  include DataMapper::Resource

  property :id, Serial
  property :title,            String    
  property :description,      Text

  has n, :mix_clips
  has n, :mixes, :through => :mix_clips
end

MixClip объединяет таблицы Mix / Clip и включает в себя дополнительное свойство для описания клипа (порядка). Я хотел бы знать, возможно ли иметь объект клипа и иметь возможность ссылаться на текущий клип в контексте, в который он был загружен.

Допустим, я загружаю микс и клип примерно так:

mix = Mix.first
clip = mix.clips.first

Есть ли способ получить MixClip, связанный с этим конкретным клипом?

clip.mix_clip.order

Он был загружен через соединение между таблицами, поэтому я думаю, что есть способ сделать это.

Я знаю, что могу просто взять все миксы-> микс-> клипы-> и и углубиться, но мне было интересно, смогу ли я вернуться на уровень выше ... было бы проще.

Для тех, кому интересно, я пытаюсь использовать это, потому что dm-serializer не имеет полной поддержки вложенных ассоциаций при возврате json / xml, и я хотел бы иметь возможность просто определить метод, который возвращает данные.

Спасибо.

1 Ответ

2 голосов
/ 14 ноября 2010

Без изменения какого-либо кода вы сможете:

mix_clip = clip.mix_clips.first(:mix => mix, :clip => clip)

для доступа к записи о присоединении, связанной с вашими ресурсами mix и clip.

В настоящее время в DM есть ошибка, которая делает ненадежным выполнение следующих действий без каких-либо дополнительных мер:

mix_clip = clip.mix_clips.get(mix.id, clip.id)

Это потому, что DM забывает порядок, в котором были определены отношения, и, таким образом, в настоящее время не может достоверно знать, в каком порядке метод .get должен принимать компоненты первичного ключа.

Вы можете обойти это, определив свойства внешнего ключа явно в вашей модели соединения, например, так (обратите внимание, что вам все равно придется явно объявить отношения):

class MixClip
  include DataMapper::Resource

  property :id,      Serial
  property :order,   Integer      

  property :mix_id,  Integer, :key => true
  property :clip_id, Integer, :key => true

  belongs_to :mix
  belongs_to :clip
end

Это гарантирует, что DM знает, что .get принимает первичный ключ как (mix_id, clip_id), так что теперь вы можете звонить

mix_clip = clip.mix_clips.get(mix.id, clip.id)

Причина, по которой вы хотите это сделать, заключается в том, что при вызовах .get учитывается карта идентификации, которая, в зависимости от ваших характеристик доступа, может обеспечить более высокую производительность.

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