如何将旧版查询转换为ActiveRecord Rails方式

时间:2010-05-03 20:58:48

标签: ruby-on-rails activerecord

我的代码中有一个查询,如下所示

@sqladdpayment = "INSERT INTO payments (orderid, ttlprodcost, paytype, 
paystatus,created_at,updated_at,userid,storeid) 
VALUES ('" + session[:ordersid] + "', '" + session[:totalcost] + "', '"  
+ "1"+ "', '"  + "complete" +"',current_date, current_date, '"+"1"+"','"+   "1"+"')"

此处表payments和主键为orderid。现在,我知道如果我将其转换为ActiveRecord方式,那么我就不必放置update_datecurrent_date,因为它会将其置于自己的位置。它还会将orderid置于其自身(auto_increment)。

我正在寻找一种方法将上述查询转换为ActiveRecord Rails方式,但仍然可以将orderid放在我自己的session[:ordersid]上。我不想依赖auto_increment,因为那时我将不得不重构其他代码。这可能是一个快速而肮脏的修复,但我想知道这种灵活性是否在rails中提供?

我多次想过这个问题。为什么轨道不能让我拥有这种灵活性?

1 个答案:

答案 0 :(得分:0)

你似乎遇到了很多麻烦,或者我错过了一些东西。 ActiveRecord做事的方式是,imho手动

payment = Payments.new
payment.orderid = session[:ordersid]
payment.totalcost = session[:totalcost]
payment.paytype = 1
payment.paystatus = "complete"
payment.userid = 1
payment.storeid = 1
payment.save

现在,如果您有填写这些字段的表单,则更容易:

payment = Payment.new(params[:payment])
payment.save

因此不需要自动增量字段。如果您指定`ordersid'是id,您仍然可以手动设置该值,这将取代rails标准行为(除非您将该字段定义为数据库内的自动增量)。

例如:an article显示如何使用uuids而不是自动增量。

当我看到这段代码时,我有一个评论。通常,对于useridstoreid,可以使用内置于rails中的固有关系功能。 例如,如果付款与用户相关,则您可以

user.payments.build(params[:payment])

然后新创建的付款会自动链接到该用户。 或

payment.user = current_user

如果你有像

这样的东西
belongs_to :user

在你的模型中。 也许你已经知道所有这些,很难从你的问题中解决。