2010-04-30 41 views
0

所以我在我的主ruby文件中设置了一个变量,它处理我的所有帖子并获取请求,然后使用ERB模板实际显示页面。我将数据库处理程序本身传递到erb模板中,然后在模板中运行查询以获取所有(本示例)的授予。红宝石w/Postgres&Sinatra - 查询不会按参数排序吗?

在我的主要ruby文件:

grants_main_order = "id_num" 
get '/grants' do 
    erb :grants, :locals => {:db=>db, :order=>grants_main_order, :message=>params[:message]} 
end 

在ERB模板:

db = locals[:db] 
getGrants = db.exec("SELECT * FROM grants ORDER BY $1", [locals[:order]]) 

这会产生一些非常随机排序,但是如果我更换$ 1 ID_NUM,它的作品,因为它应该。

这是打字问题吗?我怎样才能解决这个问题?用#{locals [:order]}使用字符串替换也给出了时髦的结果。

回答

0

我会推荐使用datamapper(http://datamapper.org/)作为sinatra。这是一个非常漂亮的ORM,它处理你试图构建得很好的参数化查询。

+0

嗯,那太好了,除非我不允许安装任何额外的宝石。这是一个学校项目,尽管我并不是很担心,但却让我感到好奇。如果我继续使用Ruby,我将在未来考虑DataMapper ......现在,还有其他选择吗? – nathas 2010-04-30 16:02:48

+0

我建议的唯一的其他事情是使用sprintf来构造您的查询字符串并确保转义/转换是正确的。 – 2010-04-30 18:17:21

0

你检查过什么locals[:order]是?也许有些东西在那里。

p locals[:order]

1

参数是有投入在不断的值到查询。这是可能的和合法的,但在ORDER BY条款中使用它们并没有意义。

说你要发出此查询:如果您在字符串中把“FIRST_NAME”并把它作为一个参数

SELECT first_name, last_name 
    FROM people 
ORDER BY first_name 

,你反而得到:

SELECT first_name, last_name 
    FROM people 
ORDER BY "first_name" 

所不同的是巨大。最后的ORDER BY -clause确实告诉te数据库不要关心每一行的列值,并且就好像所有的行都是相同的。排序顺序将是随机的。