我创建了一个提供搜索条件的表单:
= 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中使用"近"范围?
到目前为止,我的所有尝试都是徒劳的.
我有以下型号
class Position < ActiveRecord::Base
belongs_to :position_name
delegate :name, to: :position_name
Run Code Online (Sandbox Code Playgroud)
而这个搜索表单
= search_form_for @search, url: '#', method: 'GET', html: {id: nil, class: "term_search_form"} do |f|
= f.text_field :name_cont, class: 'search-query', id: nil, placeholder: t('search')
Run Code Online (Sandbox Code Playgroud)
我仍然收到此错误消息:
undefined method `name_cont' for #<Ransack::Search:0x007f97187c5b80>
Run Code Online (Sandbox Code Playgroud)
我认为这是因为委托的方法名称.
如何在委派方法上使用ransack?
我有一个使用act-as-taggable-on的几个分类法的模型
class Film < ActiveRecord::Base
attr_accessible :mood_list, :genre_list, :tag_list, :country_list
acts_as_taggable_on :countries, :genres, :moods, :tags
end
Run Code Online (Sandbox Code Playgroud)
我试图让Ransack搜索找到有任何心情和完全匹配国家的记录.但它返回了0条记录,而我有匹配的记录,请参阅:
Film.search({:moods_name_in=>['happy', 'snooze']}).result.count => 2
Film.search({:countries_name_eq=>'USA'}).result.count => 2
Film.search({:moods_name_in=>['happy', 'snooze'], :countries_name_eq=>'USA'}).result.count => 0
Run Code Online (Sandbox Code Playgroud)
它什么都没有!但我肯定有一个:
>> f.countries
[#<ActsAsTaggableOn::Tag id: 13, name: "USA">]
>> f.moods
[#<ActsAsTaggableOn::Tag id: 17, name: "active">, #<ActsAsTaggableOn::Tag id: 16, name: "psyched">, #<ActsAsTaggableOn::Tag id: 15, name: "happy">]
The SQL generated is:
(3.2ms) SELECT COUNT(DISTINCT "films"."id") FROM "films" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_id" = "films"."id" AND taggings.context = ('moods') AND "taggings"."taggable_type" = 'Film' …Run Code Online (Sandbox Code Playgroud) activerecord has-and-belongs-to-many acts-as-taggable-on arel ransack
我有一个使用Ransack宝石的应用程序,我将它从Mysql转换为Postgres.
在排序列来自关联表并且distinct选项设置为true的实例中,Postgres会抛出此错误:
PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
Run Code Online (Sandbox Code Playgroud)
Ransack github页面说,在这种情况下,"你是靠自己的."
什么是最好的 - 任何! - 处理这种情况的策略?
q = Contact.includes(:contact_type).search
q.sorts = ['contact_type_name asc']
q.result(distinct: true)
PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在Ransack中使用高级搜索,它具有默认AND.我把它作为OR通过放入.try(:merge,m:'或'))
@search = Data.search(params[:q].try(:merge, m: 'or'))
Run Code Online (Sandbox Code Playgroud)
但我无法像在Ransack Demo中显示的条件组那样得到AND/OR下拉http://ransack-demo.herokuapp.com/users/advanced_search
如何做到这一点不幸的是Ransack wiki没有提及它.
我们的代码
data_controller.rb
def search
@search = Data.search(params[:q])
@datum = @search.result(:distinct=>true).paginate(page: params[:page], per_page: 10)
if params[:q].nil?
@datum = Prospect.where(:id => 0).paginate(page: params[:page], per_page: 10)
end
@page = params[:page] || 0
@pids = @search.result(:distinct=>true).pluck(:id)
@search.build_condition
# @search.build_grouping unless @search.groupings.any? (I have tried this code too but this gives an error)
end
Run Code Online (Sandbox Code Playgroud)
的routes.rb
resources :data do
collection do
get :search
post :search, to: 'data#search'
end
end
Run Code Online (Sandbox Code Playgroud)
data.html.erb
<script type="text/javascript">
var ids = …Run Code Online (Sandbox Code Playgroud) 我们的项目目前正在使用Ransack,我们正在考虑介绍Thinking-Sphinx.但是他们都使用搜索关键字.有没有办法在同一个项目中使用Thinking-Sphinx和Ransack?
预先感谢.
我在我的rails项目中使用Ransack的sort_link来显示我的支付模型的费用列表.但是,'fee_amount'不是支付模型的属性,而是账单模型的类方法(属于支付).我现在拥有的是:
<%= sort_link @search,:bill_fee_amount,"便利费"%>
应该访问当前付款的账单并在该账单上调用'fee_amount'方法,该方法进行一些计算并返回浮点数.这是我希望搜索的浮标.
可以这样做,还是我只能根据我正在处理的模型的属性进行排序?
一个基本的问题,但是我在项目页面或Wiki中找不到清晰的内容。我有以下代码:
field = "secre"
Position.search( {:description_cont => field, :code_cont => field}).result(:distinct => true).to_sql
=> "SELECT DISTINCT `positions`.* FROM `positions` WHERE ((`positions`.`description` LIKE '%secre%' AND `positions`.`code` LIKE 0))"
Run Code Online (Sandbox Code Playgroud)
但是我的查询应该是这样的:
=> "SELECT DISTINCT `positions`.* FROM `positions` WHERE ((`positions`.`description` LIKE '%secre%' OR `positions`.`code` LIKE 0))"
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。提前致谢
我有一张桌子,'工作'有一个enum字段'status'.status具有以下枚举集:
enum status: [ :draft, :active, :archived ]
Run Code Online (Sandbox Code Playgroud)
使用ransack,如何过滤表格,比如所有活动记录?
根据Ransack文档,可以将自定义参数传递给 ransacker方法:
class Person < ApplicationRecord
ransacker :author_max_title_of_article_where_body_length_between, args: [:parent, :ransacker_args] do |parent, args|
min, max = args
query = <<-SQL
(SELECT MAX(articles.title)
FROM articles
WHERE articles.person_id = people.id
AND CHAR_LENGTH(articles.body) BETWEEN #{min.to_i} AND #{max.to_i}
GROUP BY articles.person_id
)
SQL
Arel.sql(query)
end
end
Run Code Online (Sandbox Code Playgroud)
在同一文档中甚至还有一个传递自定义参数的示例:
Person.ransack(
conditions: [{
attributes: {
'0' => {
name: 'author_max_title_of_article_where_body_length_between',
ransacker_args: [10, 100]
}
},
predicate_name: 'cont',
values: ['Ransackers can take arguments']
}]
)
Run Code Online (Sandbox Code Playgroud)
但是,没有关于如何从视图传递自定义参数的文档,因为似乎没有search_form_for帮助程序可以做到这一点。
有没有一种方法可以通过表单传递这些参数,而不需要解析控制器中的参数来执行示例中指出的搜索?