在Sequel中检索嵌套记录

abh*_*jit 5 ruby sqlite sequel

我正在尝试从以下两个表中检索嵌套形式的数据(在SQLite中)

DB = Sequel.sqlite('database.sqlite')

DB.create_table? :artists do
    primary_key     :id
    String          :name
end

DB.create_table? :albums do
    primary_key     :id
    String          :title
    foreign_key     :artist_id,
                    :artists,
                    :key => :id
end

artists = DB[:artists]
albums = DB[:albums]

id1 = artists.insert(:name => 'Mike')
id2 = artists.insert(:name => 'John')

albums.insert(:title => 'Only You', :artist_id => id1 )
albums.insert(:title => 'Only Us', :artist_id => id1 )
albums.insert(:title => 'Only Me', :artist_id => id2 )
Run Code Online (Sandbox Code Playgroud)

我想要的输出 -

[
  {
    :id => 1,
    :name => 'Mike'
    :albums => [
      {
        :id => 1,
        :title => 'Only You'
      },
      {
        :id => 2,
        :title => 'Only Us'
      }
    ]
  },
  {
    :id => 2,
    :name => 'John'
    :albums => [
      {
        :id => 3,
        :title => 'Only Me'
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我试过'急切'加载 -

class Artist < Sequel::Model(:artists)
  one_to_many  :db[:albums], :key => :artist_id
end

class Album < Sequel::Model(:albums)
  many_to_one  :artist, :key => :artist_id
end


Artist.eager(:albums).all{ |a| p a }
Run Code Online (Sandbox Code Playgroud)

但那没用.

谁能指出我正确的方向?

Jer*_*ans 4

Artist.eager(:albums).all确实会急切地加载相册,但{|a| p a}不会显示相册(因为Sequel::Model#inspect仅显示当前模型的值,而不显示任何关联的对象)。用于{|a| p [a, a.albums]}查看相册是否已加载。

如果您想生成您描述的哈希值:

Artist.eager(:albums).all.map do |a|
  a.values.merge(:albums=>a.albums.map{|al| al.values})
end
Run Code Online (Sandbox Code Playgroud)