Ruby on rails 将ActiveRecord语句转换为postgresql查询-Rails 4/postgresql 9.4

Ruby on rails 将ActiveRecord语句转换为postgresql查询-Rails 4/postgresql 9.4,ruby-on-rails,postgresql,ruby-on-rails-4,activerecord,Ruby On Rails,Postgresql,Ruby On Rails 4,Activerecord,如何将以下活动记录查询转换为原始postgresql 我只想转换带有“@available\u deal=deal where…”的行 app/controllers/deals\u controller.rb def show_deals_available @deal = Deal.friendly.find params[:id] # no need to turn this into postgresql @available_deal = Deal.where('dea

如何将以下活动记录查询转换为原始postgresql

我只想转换带有“@available\u deal=deal where…”的行

app/controllers/deals\u 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
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
编辑感谢反馈

我在本地控制台上复制/粘贴了我的文件中的查询,并用我的变量(@deal.id)替换了这个数字

所以现在我有:

app/controllers/deals\u 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
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 = ...
...                               ^
....

在执行代码时,您可以只看一下rails控制台。在那里,您应该会找到一个看起来有点像

SELECT*FROM deal\u id=1,deal\u status='not\u happed'
这是SQL中的对应行

编辑:

您似乎想在ruby代码中注入原始SQL。对于可以以不同方式解决的问题,这被认为是不好的风格,因为在更新rails或更改DB后端时,这可能会中断。尽管如此,如果你真的想走这条路,你可以这样做

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"

对不起,我一定很累了。对不起,它不起作用。我复制粘贴了控制台查询:我得到一个错误,请检查我将在几分钟内编写的编辑。我知道这不是Railsy,但此查询将在10M行或更大的表上每秒发生一次,因此尝试对其进行优化,即使我需要离开Railsy way+如果数据库发生更改,则会出现缺陷。我现在就试试你的答案。你可能应该研究索引的主题,而不是通过这些方法来优化它。是的,把一段SQL粘贴到一堆Ruby代码中。没有什么会出错的,对吗?;)您的最终目标是什么?了解更多sql并直接在我的控制器中使用原始sql I find rails方法find_by_sql也许我可以尝试一下,但它是否像“real ra sql”或它仍然是活动记录,这将比真正的原始sql少一些脂肪。抱歉,这里是新手。实际上,不鼓励在Rails中使用普通SQL。它往往更长,风险更高,维护性更低。