2015-09-26 3 views
1

Как вы переводите следующий запрос Active Record в raw postgresql?Преобразование инструкции ActiveRecord в postgresql query- Rails 4/postgresql 9.4

Я просто хочу, чтобы преобразовать строку с '@available_deal = Deal где ...

приложение/контроллеры/deals_controller.rb

def show_deals_available 
    @deal = Deal.friendly.find params[:id] # no need to turn this into postgresql 
    @available_deal = Deal.where('deal_id = ? AND deal_status = ?', 
         @deal.id, "not_yet_taken").first 
    respond_to do |format| 
     format.js 
    end 
    end 

EDIT благодаря обратной связи

Я пошел на моей локальной консоли и скопировал/вставил запрос в мои файлы и просто заменил номер моими переменными вроде (@ deal.id)

Итак, теперь у меня есть:

приложение/контроллеры/deals_controller.rb

def show_deals_available 
    @deal = Deal.friendly.find params[:id] # no need to turn this into postgresql 
    @available_deal = Deal.where('deal_id = ? AND deal_status = ?', 
         @deal.id, "not_yet_taken").first 
    @available_deal = SELECT "deals".* FROM "deals" WHERE (deal_id = @deal.id AND deal_status = 'not_yet_taken') ORDER BY "deals"."id" ASC LIMIT 1 


    respond_to do |format| 
     format.js 
    end 
    end 

Но я получаю сообщение об ошибке:

SyntaxError - syntax error, unexpected tCONSTANT, expecting keyword_end 
...ROM "deals" WHERE (deal_id = @deal.id AND ... 
...        ^
/deals_controller.rb:70: syntax error, unexpected tCONSTANT, expecting ')' 
..." WHERE (deal_id = @deal.id AND deal_status = ... 
...        ^
.... 
+0

Да, вставив кусок SQL в кучу кода Ruby. Ничто не может пойти не так, верно? ;) Какова конечная цель, которую вы преследуете? –

+0

узнайте больше sql и перейдите на raw sql прямо внутри моего контроллера – Mathieu

+0

Я нашел метод rails find_by_sql, возможно, я могу попробовать это, но это похоже на «real ra sql» или это все еще активная запись, которая будет меньше жиров, чем настоящий raw sql. извините новобранец здесь. – Mathieu

ответ

2

Вы можете просто просто взглянуть на консоли рельсах при выполнении кода. Там вы должны найти запись, которая выглядит примерно так:

SELECT * FROM deals WHERE deal_id = 1 AND deal_status = 'not_yet_taken' 

которая является соответствующей строкой в ​​SQL.

Edit:

Вы, кажется, хотите, чтобы ввести сырые SQL в коде рубина. Это считается плохим стилем для вещей, которые могут быть решены по-разному, так как это может сломаться при обновлении рельсов или изменении бэкэнда БД. Тем не менее, если вы ДЕЙСТВИТЕЛЬНО хотите пройти этот маршрут, вы можете сделать что-то вроде

Deal.find_by_sql("SELECT \"deals\".* FROM \"deals\" WHERE (deal_id = #{@deal.id} AND click_win_throbber_status = 'not_yet_clicked') ORDER BY \"deals\".\"id\" ASC LIMIT 1" 
+0

немой мне жаль, я, должно быть, устал – Mathieu

+0

Извините, но это не сработало. Я скопировал консольный запрос: я получаю сообщение об ошибке, пожалуйста, проверьте изменение, которое я собираюсь написать через минуту. – Mathieu

+0

Я знаю, что это не Railsy, ​​но этот запрос будет происходить каждую секунду в таблице строк 10M или более, поэтому пытаясь его оптимизировать даже если мне нужно отходить от пути Railsy + disavantages при изменении дБ, конечно. Попробуй свой ответ. – Mathieu