5

次の2つのテーブルからネストされた形式でデータを取得しようとしています(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

2 に答える 2

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
于 2012-11-20T16:58:25.720 に答える
2

Artist にメソッドを追加して、希望どおりに出力することができます

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

を使用する代わりに、Album メソッド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
  }
]
于 2012-11-20T15:19:51.570 に答える