我是Ruby on Rails的新手,我正在创建我的第一个网站.我有3列的用户模型:firstname,lastname和email.我使用ransack制作搜索引擎,我希望有一个搜索字段,它将遍历每一列并显示结果.
我创建了一个user_controller.rb,如下所示:
@q = User.search(params[:q])
@users = @q.result(:distinct => true)
Run Code Online (Sandbox Code Playgroud)
我的User\index.html.erb看起来像这样:
<%= search_form_for @search do |f| %>
<div class="field">
<%= f.label :firstname_cont , "Firstname" %>
<%= f.text_field :firstname_cont %>
<%= f.label :lastname_cont , "Lastname" %>
<%= f.text_field :lastname_cont %>
<%= f.label :email_cont , "Email" %>
<%= f.text_field :email_cont %>
</div>
<div class="actions"><%= f.submit "Search" %></div>
<% end %>
Run Code Online (Sandbox Code Playgroud)
给了我3个搜索字段,但我只想要一个通过名字,姓氏和电子邮件.
编辑1:在测试了一些之后,我发现搜索字段不能同时处理名字和姓氏,也不能处理任何空格.我已经读过可以像这样制作一个helper_method: 用Ransack搜索多个字段
当我得到搜索结果时,我会被扔进我的模型索引等:user/index.我在哪里可以改变这个?
但是在视图中如何使用它没有任何意义.为什么这么辛苦,这就是你所做的:在Controller中这样做 - >在模型中做这个 - >在视图中做这个 - …
Ransack是否支持HABTM?
拥有模型:
我可以使用ransack通过单一类别搜索商店吗?表格是什么样的?
我有一个配方模型,其中包含很多成分,每种成分都属于一个项目.在我的高级搜索表单中,我希望用户选择多种成分,让Ransack找到包含用户选择的所有成分的配方.
我尝试了以下搜索字段:
= f.collection_select(:ingredients_item_id_in, Item.all, :id, :name, {}, {multiple: true})
Run Code Online (Sandbox Code Playgroud)
但从逻辑上讲,这会导致显示的所有配方都含有任何选定的成分.
由于一条记录不能包含多个item_id值,因此更改:ingredients_item_id_in为:ingredients_item_id_in_all不正确的查询结果.
有关在Ransack中创建此搜索参数的任何想法,还是应该为此创建子查询?
根据要求,我的控制器搜索方法:
def search
@q = Recipe.ransack(params[:q])
@recipes = @q.result(distinct: true).include_related_models.published
end
Run Code Online (Sandbox Code Playgroud) 所以我花了很多时间来编写这个查询,然后发现这是一个很难的方式,它返回一个数组而不是一个activerecord关系.DOH.这不会是一个问题,但我需要在这些结果上使用Ransack,这需要关系.
所以,基本上,我需要使用语法.joins()和.select()将其转换为Rails,但我尝试过的所有内容都出错了.我猜我可能需要潜入AREL?
或者,如果这可以很容易地转换为具有最小性能问题的activerecord关系并保留我的别名列,那么它也可以工作!
任何帮助或建议都受到赞赏!
find_by_sql("
SELECT
subq.*,
renewal_date,
days_until_due,
renewal_stage_sort,
(
CASE
WHEN renewal_stage_sort IS NOT NULL THEN
CASE
WHEN days_until_due > 42 AND renewal_stage_sort >= 1 THEN TRUE
WHEN days_until_due > 28 AND days_until_due < 43 AND renewal_stage_sort >= 2 THEN TRUE
WHEN days_until_due > 13 AND days_until_due < 29 AND renewal_stage_sort >= 3 THEN TRUE
WHEN days_until_due > -1 AND days_until_due < 14 AND renewal_stage_sort >= 4 THEN TRUE
WHEN days_until_due < 0 AND renewal_stage_sort >= 5 THEN …Run Code Online (Sandbox Code Playgroud) 首先,我是RoR的新手,所以答案可能很明显,在这种情况下我道歉.我环顾四周,找不到任何有用的东西.
我正试图在我的应用程序的每个网页的标题上都有一个搜索表单,它将搜索我所有"桶"的名称.这是相关代码:
在app/views/layouts/_header.html.erb中(在导航栏中):
<% search_form_for @q do |f| %>
<%= f.label :name_cont %>
<%= f.text_field :name_cont %>
<%= f.submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
在app/controllers/buckets_controller.rb中:
def index
unless params[:q].blank?
@q = Bucket.search(params[:q])
@buckets = @q.result.paginate(:page => params[:page])
else
@buckets = Bucket.find(:all, :limit => 5).paginate(:page => params[:page])
end
end
Run Code Online (Sandbox Code Playgroud)
我理解最后一部分并不是那么好:我想要做的就是如果我只是访问存储桶索引页面(而不是通过搜索),我会显示最近创建的5个存储桶.当我在标题表单中搜索某些内容时,我会访问索引页面,但只显示搜索到的内容.(处理它的更好方法是将搜索页面与索引页面分开吗?)
我发现这个问题几乎完全相同,但是@q如果每个页面都有表格,我仍然不知道如何处理- 当然我不必改变每个控制器的每一个动作?
提前抱歉,因为我的愚蠢,我的愚蠢!
model-view-controller ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ransack
我想搜索所有NULL或使用ransack值为-1的字段.
search({:param_name_null => 1 })
Run Code Online (Sandbox Code Playgroud)
将给出空值
search({:param_name_is_any => -1 })
Run Code Online (Sandbox Code Playgroud)
将给出-1s
如何使用ransack在这两者之间进行OR?谢谢
我有一个Rails 4.0.1应用程序,使用gems activeadmin 1.0.0.pre和ransack 1.1.0.
使用ActiveAdmin,我有很多这样的错误:
NoMethodError in Admin::MyModel#action
Showing [...]/views/active_admin/resource/action.html.arb where line #1 raised:
undefined method `applied_boundaries_id_eq' for #<Ransack::Search:0x0..>
Extracted source (around line #1): insert_tag renderer_for(:index)
Run Code Online (Sandbox Code Playgroud)
每个未定义的方法都有一个"_eq"模式:
aws_instance_type_clients_id_eq
user_roles_id_eq
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
我正在使用Ransack Gem并通过计数器缓存进行计数排序.我的属性是一个整数.
我这样称呼它:
<%= sort_link(@q, :people_count, "PEOPLE") %>
Run Code Online (Sandbox Code Playgroud)
我得到的排序输出是:
[人民ASC]
1
2
0
0
[PEOPLE DESC]
0
0
2
1
我希望PEOPLE DESC能够展示:
2
1
0
0
任何人都可以帮忙吗?
--- 更新 -----
经过一个多小时的搜索,我觉得我越来越近了:
首先,我必须编辑我的观点:
从
<%= mycontact.people.count %>
Run Code Online (Sandbox Code Playgroud)
至
<%= mycontact.people_count %>
Run Code Online (Sandbox Code Playgroud)
这会将全零变为零.
现在我的排序输出是:
[PEOPLE DESC]
无
零
2
1
然后我做了一些挖掘,并在github上找到了这个问题的链接,这解释了你必须添加NULLS LAST.
所以我将以下代码添加到peoples_controller.rb:
@q.result.except(:order).order("#{@q.sorts.first.attr_name} #{@q.sorts.first.dir} NULLS LAST")
Run Code Online (Sandbox Code Playgroud)
我很兴奋,因为它工作,但然后重新启动我的服务器后收到以下错误:
未定义的方法`attr_name'代表nil:NilClass
假设我有一个带有:email字段的User类.我们假设我使用activeadmin来管理用户.
制作一个返回与一个字符串匹配的电子邮件的过滤器,例如"smith",非常简单.在admin/user.rb,我只是包括该行
filter :email
Run Code Online (Sandbox Code Playgroud)
这给了我一个完成工作的过滤器小部件.
但是,此过滤器不允许我搜索多个项的交集.我可以搜索包含"smith"的电子邮件,但不能搜索包含"smith"和".edu"的电子邮件.
Google告诉我,activerecord 在引擎盖下使用Ransack,而Ransack演示具有允许多个术语搜索的"高级"模式.
将多项搜索小部件放入activeadmin的最简单方法是什么?
理想情况下,我想要一个小部件,允许我输入smith .edu或smith AND .edu过滤包含这两个术语的电子邮件.
我创建了一个提供搜索条件的表单:
= search_form_for @q do |f|
%h3
Search:
= f.label :category_id
%br
= f.collection_select :category_id_eq, Category.all, :id, :name, :include_blank => true
%br
= f.label "Sub-Category"
%br
= f.collection_select :subcategory_id_eq, Subcategory.all, :id, :name, :include_blank => true, :prompt => "select category!"
%br
= f.label "Contains"
%br
= f.text_field :title_or_details_cont
%br
= f.submit
Run Code Online (Sandbox Code Playgroud)
我希望能够根据Rails Geocoder gem的"Near"功能进行搜索.有没有人知道如何合并现有的范围,或者特别是如何在Meta Search或Ransack中使用"近"范围?
到目前为止,我的所有尝试都是徒劳的.