0

我希望能够使用 DataMapper 进行动态查询,以便为我的 Sinatra 项目搜索 Sqlite 数据库。这可能吗?到目前为止,我已经想出了类似这样的方法,试图获取由命名参数指定的艺术家演唱的歌曲:

get '/artists/:name' do
@artist = Artist.get(params[:name])
@songs= Song.all(:artist_name => '#{artist.name}')
slim :show_artists
end

这些是我的 DataMapper 类:

configure:development do
    DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/3sbase.db")
    DataMapper.auto_migrate!
end

class Song
    include DataMapper::Resource
    property :id, Serial
    property :title, String
    property :year, Integer
    belongs_to :artist
end

class Artist
    include DataMapper::Resource
    #property :id, Serial
    property :name, String, :key=>true
    property :age, Integer
    has n, :songs
end




DataMapper.finalize

这是我的 .slim 文件

/show_artists.slim

h1= @artist.name
p Age: #{@artist.age}

- if @songs.any?
    ul#songs
      -@songs.each do |song|
        p <a href="/songs/#{song.id}">#{song.title} </a>
- else
  p There are no songs from this artist/band in the database.

每次 if 语句返回 false 时,我都会得到“数据库中没有该艺术家/乐队的歌曲”。尽管我在我的数据库中搜索的艺术家演唱了一些歌曲。

4

1 回答 1

0

在 sinatrarb google group 中询问后,我被建议更改

@songs= Song.all(:artist_name => '#{artist.name}') 

用这条线:

@songs= Song.all(:artist => {:name => @artist.name})

或者有了这个

@songs= @artist.songs

他们都工作正常

于 2013-11-14T18:04:24.443 回答