1

Sinatra のパスからデータを取得し、それを使用して Datamapper を使用して特定のレコードを検索しようとしています。Datamapper docs はそれを示しているようです。

get "/test/:test_path" do
    test_get = Intake.get( params[:test_path] )
    # Do stuff
    erb :blah_blah_blah
end

シンボル に関連付けられたすべてのレコードを検索する必要があります。test_path

これは動作しません。test_get は nil になります。

一方、機能するのは

get "/test/:test_path" do
    test_all = Intake.all(:test_path => params[:test_path] )
    # Do stuff
    erb :blah_blah
end

私の2つの質問は次のとおりです。

  1. Datamapper の .get() 呼び出しで何が間違っていますか?
  2. .all(:name => value) メソッドは .get() より遅いですか、それともどちらを使用しても問題ありませんか?

これは、動作を示すために簡略化された Sinatra スクリプトです。

#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'dm-timestamps'

DataMapper.setup(:default, {:adapter => 'yaml', :path => 'db'})

class Intake
  include DataMapper::Resource

  property :id,         Serial
  property :created_at, DateTime
  property :test_path,  String
end

get "/test/:test_path" do

  test_all = Intake.all(:test_path => params[:test_path] )
  puts 'test_all:' test_all.inspect

  test_get = Intake.get( params[:test_path] )
  puts 'test_get:' test_get.inspect

  "Hello World!"
end
4

1 に答える 1

1

#get主キーに基づくルックアップのみを実行します。はidです。それで

Intake.get(params[:test_path])

idを持つものを探しますが、params[:test_path]失敗します。使用する

Intake.first(test_path: params[:test_path])
于 2012-12-28T05:31:37.247 に答える