Получить связанную модель с DataMapper (Ruby) - PullRequest
1 голос
/ 02 января 2012

При определении связей в классах для Datamapper вы, похоже, не получаете связанные данные модели по умолчанию.

Например:

class Song
    include DataMapper::Resource

    property :id,           Serial
    property :name,         String
    property :artist_id,    Integer

    belongs_to :artist
end

class Artist
    include DataMapper::Resource

    property :id,       Serial
    property :name,     String

    has n, :songs
end

Song.get(params[:id]).to_json

запрос песни не выполняетсяобъединение с таблицей художников по умолчанию.Как вы выполняете объединение и получаете Исполнителя вместе с Песней в примере выше?Запросы любого класса по отдельности работают нормально.Обратите внимание, что это существующая база данных, созданная не через DataMapper.

Заранее спасибо!

1 Ответ

2 голосов
/ 25 февраля 2012

Я подозреваю, что именно то, что вы пытаетесь сделать, в настоящее время невозможно. С DataMapper вы всегда можете легко загрузить свойства, такие как исполнитель песни, и он даже использует то, что они называют стратегической энергичной загрузкой, которая описана здесь . Но даже если свойство уже было загружено, оно не будет включено в результаты, возвращаемые to_json.

Таким образом, у вас есть две альтернативы:

  1. Вы можете просто сделать дополнительное кодирование для создания хэша, а затем использовать to_json для него:
song = Song.get(params[:id])
json = song.attributes.merge({:artist => song.artist.attributes}).to_json
  1. Вы можете включить подобный код в сам класс Song:
def to_json
  self.attributes.merge({:time_zone => self.time_zone.attributes}).to_json
end

Если вы работаете с # 2, вам также нужно require 'json'.

Обратите внимание, что для DataMapper было бы плохой идеей заставить to_json работать рекурсивно. В противном случае вы можете получить целую базу данных: P

...