在我的Rails应用程序中,我想使用will_paginategem在我的SQL查询上进行分页.那可能吗?我尝试过这样的事情,但它不起作用:
@users = User.find_by_sql("
SELECT u.id, u.first_name, u.last_name,
CASE
WHEN r.user_accepted =1 AND (r.friend_accepted =0 || r.friend_accepted IS NULL)
.........").paginate(
:page => @page, :per_page => @per_page,
:conditions => conditions_hash,
:order => 'first_name ASC')
Run Code Online (Sandbox Code Playgroud)
如果没有,你能推荐一个方法吗?我不想写自己的分页.
有没有办法在rails方法中清理sql find_by_sql?
我尝试过这个解决方案: Ruby on Rails:如何在不使用find时清理SQL的字符串?
但它失败了
Model.execute_sql("Update users set active = 0 where id = 2")
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,但执行了sql代码,ID为2的用户现在已经禁用了帐户.
简单find_by_sql也行不通:
Model.find_by_sql("UPDATE user set active = 0 where id = 1")
# => code executed, user with id 1 have now ban
Run Code Online (Sandbox Code Playgroud)
编辑:
好吧,我的客户端要求在管理面板中创建该功能(由sql选择)以进行一些复杂的查询(连接,特殊条件等).所以我真的想find_by_sql那个.
第二编辑:
我想实现'邪恶的'SQL代码不会被执行.
在管理面板中,您可以键入query - > Update users set admin = true where id = 232,我想阻止任何UPDATE/DROP/ALTER SQL命令.只是想知道,在这里你只能执行SELECT.
经过一些尝试后,我总结说sanitize_sql_array不幸的是不这样做.
有没有办法在Rails中做到这一点?
对困惑感到抱歉..
美好的一天!
我在rails 3中使用find_by_sql()来获取记录,如下所示.
@list=Email.find_by_sql(["SELECT * FROM Emails WHERE sent_id=?",params[:id]])
Run Code Online (Sandbox Code Playgroud)
如果多个参数适用于同一属性,如何修改相同的语句,例如:
@list=Email.find_by_sql(["SELECT * FROM Emails WHERE (sent_id=? OR from_id=?)",params[:id],params[:id]])
Run Code Online (Sandbox Code Playgroud)
这里,sent_id和from_id属性都接收相同的参数params [:id]
所以,不是两次传递相同的参数[:id],是否有任何机制可以根据顺序传递参数?
我有一个连接到外部数据库的模型,我使用find_by_sql方法查询,如下所示:
External.find_by_sql("SELECT*from table")
但是当我添加.page(params [:page])时,会出现错误"类数组的未定义方法页面".是否可以对使用find_by_sql获取的结果进行分页?
我正在使用find_by_sql这个查询,它返回一个数组。我想做类似的事情Job.hongkong_jobs.where(status: true),但我不能,因为它是一个数组。
scope :hongkong_jobs, -> { find_by_sql "SELECT DISTINCT(jobs.*) FROM" + Task.near([22.275754, 114.163056], 35.17936816723013, :units => :km).joins(:job).where(jobs: {status: [:open,:new]}).to_sql.split("FROM").last.split("ORDER").first + "ORDER BY start_at ASC" }
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如何将其转换为活动记录对象,以便我可以.where在此范围内执行操作?
我有这个问题:
SET @current_group = NULL;
SET @current_count = 0;
SELECT user_id, MIN( created_at ) as created_at, CASE WHEN @current_group = user_id THEN @current_count WHEN @current_group := user_id THEN @current_count := @current_count + 1 END AS c
FROM notifies
G ROUP BY user_id, c
ORDER BY id desc LIMIT 0 , 10
Run Code Online (Sandbox Code Playgroud)
如果我启动它它是有效的
但如果我把它放在find_by_sql方法中,如:
Notify.find_by_sql("SET @current_group = NULL; SET @current_count = 0; SELECT user_id, MIN( created_at ) as created_at, CASE WHEN @current_group = user_id THEN @current_count WHEN @current_group := user_id THEN …Run Code Online (Sandbox Code Playgroud)