新手问题 大家都怎么用 Ruby on Rails 写数据的查询功能

zerzerheart · 2015年12月17日 · 最后由 zerzerheart 回复于 2015年12月22日 · 5917 次阅读

在项目中,往往会有搜索这个功能,比如说有一个 User,然后 User 有 name(名字),age(年龄),sex(性别),created_at(创建时间) 几个属性。rails g scaffold..生成了可以 crud 操作的简单应用。现在想在 users/index.html.erb 这个页面里实现查询功能。比如说按名字查询,按年龄段查询,大家都会怎么实现呢。 我先说说我的,我是初学者,也不知道自己的方法是不是对的。 我先创建一个 search 控制器,然后在 users/index.html.erb 里添加一个 form_tag,它的 action 的动作指向一个 search 控制器,在 form_tag 里有一个 text_field,通过它把数据传到 search 控制器里面,再用这个接受的这个数据执行 User.find_by_name(也可能是别的),查出数据赋给@SearchUsers,然后跳转道 search/index.html.erb,在把@SearchUsers的值读出来,显示在页面上。 这样的方法很笨,每次都要跳转到一个新的页面,也不能重复查询,请问大家都是怎么实现这个功能的呢。

搜索用 ransank

搜索结果建议不加新页面,还是在 index 上显示,就是一个过滤的作用

我在学着用 elasticsearch,比 sql 查询快,不过文档不多好多坑

#1 楼 @kikyous 嗯,谢谢,这个 gem 怎么用啊,有相关的文档吗,google 今天上不去了

#3 楼 @zerzerheart 看 github 项目主页

#2 楼 @karrra 我也是正在学 rails,中间也遇到了很多问题,慢慢解决也慢慢进步着,解决错误有时候也是写程序的一种乐趣把,哈哈

#4 楼 @kikyous 嗯嗯,好的,谢谢指导

View 中 <%= form_tag("/list/index",method: "get") do %> #/list/index 当前页面地址 <%= label_tag(:q, "搜索:") %> <%= text_field_tag(:q) %> <%= submit_tag("确定") %> <% end %>

Controller 中 def index a = params[:q] if a.blank? @products = Product.where(flag: 1).order(created_at: :desc) else @products = Product.where("(flag = 1 AND area = :p) OR (flag = 1 AND name = :p)", p:params[:q]).order(created_at: :desc) end end

我的和楼上差不多,一般不另外做页面,直接在 index 里做过滤

def index
  if params.has_key?(:user)
    params.require(:user).permit!(:name)
    @users = User.where(params[:user])
  else
    @users = User.all
  end 
end

#8 楼 @brenda103

@products = Product.where(flag: 1).order(created_at: :desc)

flag: 1 是什么意思啊 还有这句话

@products = Product.where("(flag = 1 AND area = :p) OR (flag = 1 AND name = :p)", p:params[:q])

不太懂,嘿嘿

#9 楼 @adamshen 嗯,要是做范围查询是不是就得自己写查询语句了呢?比如说输入一个开始时间,一个结束时间,查询在这两个时间之间的记录。

http://guides.ruby-china.org/active_record_querying.html 楼主应该先把 Rails Guides 过一遍 范围可以这样写

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)

范围

数据不多的时候喜欢用 scope + has_scope。

#11 楼 @zerzerheart 时间段查询可以像楼上一样使用 Range,view 里用 select_data 就可以了。

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html

#12 楼 @stone 嗯嗯,谢谢你,里边写的很全面

#13 楼 @appell 嗯,我看看这两个 gem,谢谢你啦

#14 楼 @adamshen 新技能 get! 谢谢你啦

#10 楼 @zerzerheart 那个不用管 是显示做标记用的!后面的意思就是输入查询内容匹配模型中某个字段!

使用 ajax 对用户来说比较友好,不会刷新整个页面让使用者觉得卡顿,步骤如下:

1、将要局部刷新的地方(就是你要展示的数据的 html)做成单独视图_A.html.erb 2、在父页面 (你的 index) 中使用一个 div,等待将_A 渲染在此处

<div id="show_table"></div>

3、在 form 中加入 data-remote=“true”属性,如此才会发出 ajax 请求,并指定属性 action="foo" 4、在 controller 相应的方法 (foo()) 中响应 js 请求:

# 查询db
respond_to do |format|
    format.js
end

5.创建 foo.js.erb 文件将父页面中 render 语句转换成 javascript 后添加到父页面中

$("#show_table").html("<%= escape_javascript(render :partial => 'A')%>")

6.为 form 中的 action 加入相应的路由

#19 楼 @bright ajax 确实是个不错的选择,能提升用户体验,谢谢你的分享

#21 楼 @zerzerheart 如果不用 ajax,可以开启 Turbolinks,这样也可以没有换页效果。

https://ruby-china.org/topics/17977

@adamshen gem 真的强大!!

ransack 直接过滤不是很省时间吗

#24 楼 @1208175976 用过了 ransack,确实感觉很方便,但是我觉得照顾提升用户体验也是值得花一些时间的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号