Как преобразовать устаревший запрос в ActiveRecord Rails способом - PullRequest
1 голос
/ 04 мая 2010

У меня есть запрос в моем коде, как показано ниже

@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_date, current_date, потому что это само по себе. Это также поместит orderid на свой собственный (auto_increment).

Я ищу способ преобразовать вышеуказанный запрос в ActiveRecord Rails, но все еще могу поставить orderid самостоятельно (session[:ordersid]). Я не хочу полагаться на auto_increment, потому что тогда мне придется провести рефакторинг большого количества другого кода. Это может быть быстрое и грязное исправление, но я хочу знать, предлагается ли этот тип гибкости в рельсах?

Я задавался вопросом об этом вопросе много раз. Почему рельсы не позволяют мне иметь такую ​​гибкость?

1 Ответ

0 голосов
/ 05 мая 2010

Кажется, у тебя много неприятностей, или, может быть, я что-то упустил.Способ 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" является идентификатором, вы все равно можете установить значение вручную, что отменит стандартное поведение рельсов (если вы не определили поле как автоинкрементное в базе данных).1009 * статья , показывающая, как использовать uuids вместо автоинкремента.

У меня есть замечание, когда я вижу этот код.Обычно для userid и storeid можно использовать встроенные реляционные возможности, встроенные в рельсы.Например, если платеж связан с пользователем, вы либо делаете

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

, а затем вновь созданный платеж автоматически связывается с пользователем.Или

payment.user = current_user

, если в вашей модели будет что-то вроде

belongs_to :user

.Может быть, вы уже знаете обо всем этом, что трудно сделать из вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...