2012-11-20 38 views
5

我想从以下两个表中检索嵌套表格数据(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) 

输出,我试图让 -

[ 
    { 
    :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' 
     } 
    ] 
    } 
] 

我试过'急切'加载 -

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 } 

但是,这并没有奏效。

任何人都可以指向正确的方向吗?

回答

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 
+0

谢谢你让我知道为什么我没有看到“相册”! – globetrotter

2

您可以到艺术家添加一个方法来输出的方式,你希望它

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

    def my_hash 
    to_hash.merge!(
     { 
      :albums => albums.map{|a| 
       a.to_hash.reject!{ |k,v| 
        k==:artist_id 
       } 
      } 
     } 
    ) 
    end 
end 

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

records = Artist.all.map{ |a| a.my_hash } 
p records 

而不是使用reject!这将是清洁剂添加my_hash方法相册将不:artist_id返回散列,但你明白了。这个输出:

[ 
    { 
    :albums=>[ 
     { 
     :title=>"Only You", 
     :id=>1 
     }, 
     { 
     :title=>"Only Us", 
     :id=>2 
     } 
    ], 
    :name=>"Mike", 
    :id=>1 
    }, 
    { 
    :albums=>[ 
     { 
     :title=>"Only Me", 
     :id=>3 
     } 
    ], 
    :name=>"John", 
    :id=>2 
    } 
]