使用DataMapper获取相关模型(Ruby)

时间:2012-01-02 03:41:54

标签: mysql ruby sinatra datamapper

在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 个答案:

答案 0 :(得分:2)

我怀疑你正在尝试做的事情目前是不可能的。使用DataMapper,您可以随时轻松加载像歌曲艺术家这样的属性,甚至可以使用他们称之为策略性预先加载的内容,这些内容将在here中进行描述。但即使已经加载了该属性,它也不会包含在to_json返回的结果中。

所以你有两种选择:

  1. 你可以简单地做一些额外的编码来组成一个哈希,然后在其上使用to_json
  2. song = Song.get(params[:id])
    json = song.attributes.merge({:artist => song.artist.attributes}).to_json
    
    1. 您可以在Song类本身中包含类似的代码:
    2. def to_json
        self.attributes.merge({:time_zone => self.time_zone.attributes}).to_json
      end
      

      如果你使用#2,你还必须require 'json'

      请注意,DataMapper使to_json递归工作不是一个好主意。否则你最终可能会返回整个数据库:P