标签: ransack

从ActiveRecord范围中删除订单

我正在使用rails ransack(https://github.com/ernie/ransack)来允许用户过滤和排序某些记录.我使用传统方法获取过滤和排序的记录.

 @invoices = Invoice.search(params[:q]).result
Run Code Online (Sandbox Code Playgroud)

现在我想得到一些摘要信息,所以我有

 @invoices = Invoice.search(params[:q]).result
 @summary = @invoices.select("sum(balance) as balance_total").first
Run Code Online (Sandbox Code Playgroud)

除非用户指定要排序的字段.我收到SQL错误:

 Column "project_name" is invalid in the ORDER BY clause because 
 it is not contained in either an aggregate function or the GROUP BY clause
Run Code Online (Sandbox Code Playgroud)

我可以从范围中删除排序吗?怎么样?

谢谢

activerecord ruby-on-rails ransack

60
推荐指数
1
解决办法
2万
查看次数

Rails + Ransack - 下拉列表集合?

我喜欢hansack gem的灵活性,但是我无法让标准的collection_select正常运行.也许有人可以提供帮助

例:

      <%= collection_select(:expense, :project_id, Project.all, 
        :id, :name, { prompt: 'Select Project'}, { class: 'span4' }) %>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,此代码来自费用输入屏幕,因此第一个参数是费用对象.在搜索形式中它应该是什么?另外,我知道我需要在那里获得后缀.在这个例子中,我想将project_id_eq作为搜索模式.

此外,我的表单在控制器和视图"报告",我不是将此搜索放在默认控制器中.

谢谢!

ruby-on-rails ransack

17
推荐指数
2
解决办法
1万
查看次数

使用Ransack一次搜索多个模型

我的应用程序标题中有一个搜索表单,我想使用此搜索表单在应用程序中搜索多个模型.

例如像一个请求/search?q=rails应触发通过多个模型如搜索Work,Project,User和它们的定义的属性.我想使用Ransack,因为我已经Work在应用程序的不同区域的模型上使用它.

我想我还不太了解Ransack,文档总是指出你必须定义@q = MyModel.search(params[:q])在表单中使用它search_form_for @q.有没有一种方法可以提前定义特定模型?只需传递参数名称即可search_form_for :q

ruby search ruby-on-rails ransack

17
推荐指数
1
解决办法
7246
查看次数

如何设置搜索排序的默认值?

简单地说,我只想知道是否有办法使用Ransack gem设置排序功能的默认值?即.

目前,页面加载时我有以下内容:

empty_ransack

但相反,我希望在页面加载时具有以下默认值:

搜索默认值

是否可以通过正确配置Ransack宝石来实现这一目标?

一如既往地感谢!

最好的祝福!

ruby ruby-on-rails-3.2 ransack

16
推荐指数
2
解决办法
6596
查看次数

Ransack:如何使用现有范围?

将Rails 2应用程序转换为Rails 3,我必须替换gem searchlogic.现在,使用Rails 3.2.8和gem Ransack我想构建一个使用现有范围的搜索表单.例:

class Post < ActiveRecord::Base
  scope :year, lambda { |year| 
    where("posts.date BETWEEN '#{year}-01-01' AND '#{year}-12-31'") 
  }
end  
Run Code Online (Sandbox Code Playgroud)

据我所知,这可以通过定义自定义搜索来实现.可悲的是,我没有找到任何关于此的文档.我在Post课堂上尝试过这个:

ransacker :year, 
          :formatter => proc {|v| 
            year(v)
          }
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

Post.ransack(:year_eq => 2012).result.to_sql
=> TypeError: Cannot visit ActiveRecord::Relation
Run Code Online (Sandbox Code Playgroud)

我尝试了ransacker声明的一些变体,但它们都不起作用.我需要一些帮助...

更新:上面的范围只是示例.我正在寻找一种方法来使用Ransack中的每个现有范围.在Ransack的前身MetaSearch中,有一个要求search_methods使用范围的功能.Ransack 尚未支持此开箱即用.

ruby-on-rails arel ruby-on-rails-3 ransack

14
推荐指数
2
解决办法
9169
查看次数

在Ransack上为rails设置默认搜索参数

我一直在抨击我的大脑,但无法得到它.我觉得答案可能很明显.

我想要做的是以下内容:

我有一个索引控制器,列出了一系列我可以使用Ransack搜索的作业.每个作业都有一个完成日期,其中包含日期或为空(未完成).目前,搜索本身效果很好.我想这样做,以便索引页面加载只显示未完成的工作,但我也希望它工作,以便当有人确实运行搜索时,返回完成和未完成工作的结果.

任何帮助将不胜感激.在下面的代码中,:actual是具有完成日期的字段的名称.我也在环顾网络,并认为可能像DEFAULT_SEARCH_PARAMETER={}我在Job模型中所做的那样可能有效,但我似乎无法理解.这是代码:

class Job < ActiveRecord::Base
  DEFAULT_SEARCH_PARAMETER ={}
  attr_accessible :items_attributes, :actual
end

def index
   @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER)
   @search.build_condition
   @results = @search.result
   @job = @results.paginate(:per_page => 10, :page => params[:page])
end
Run Code Online (Sandbox Code Playgroud)

search ruby-on-rails ruby-on-rails-3 ransack

13
推荐指数
2
解决办法
7652
查看次数

Rails排序与Ransack的关联

第一次海报.我正在尝试使用Ransack gem和Kaminari对用户表进行排序.当我使用name,id等进行排序时,但是当我尝试与posts_count建立关联时,排序中断并且不起作用.注意:在视图中,'u.posts.count'正常工作.我在用户模型中尝试过自定义范围,并为搜索参数创建自定义对象,但似乎没有任何效果.我认为我在默认范围或没有数据的@search对象中遇到了麻烦.需要帮忙!

以下是一些相关的片段:

车型/ user.rb

  has_many :posts, :dependent => :destroy 
Run Code Online (Sandbox Code Playgroud)

车型/ post.rb

  belongs_to :user 

  default_scope :order => 'post.created_at DESC'
Run Code Online (Sandbox Code Playgroud)

控制器/ users_controller.rb

  def index
    @title = "User Index"
    @search = User.search(params[:q]) # Ransack
    @total_users = User.all.count
    # .per(10) is the per page for pagination (Kaminari).
    @users = @search.result.order("updated_at DESC").page(params[:page]).per(10) #This displays the users that are in the search criteria, paginated.
  end
Run Code Online (Sandbox Code Playgroud)

意见/用户/ index.html.erb

  ..
  <%= sort_link @search, :posts_count, "No. of Posts" %> #Sort links at column headers
  .. 
  <% @users.each do …
Run Code Online (Sandbox Code Playgroud)

sorting ruby-on-rails-3 ransack

12
推荐指数
1
解决办法
7638
查看次数

Ransack与数组值完全匹配

我必须使用ransack在数据库上执行搜索.数据库中的一些列将数据存储在序列化数组中.我想将存储在数组中的确切数据与用户发送的数据进行匹配以执行搜索(用户的数据也是数组).例如,在数据库中,一列的数据为(c1,c2是测试用例):

c1.column_data = [1, 2, 3, 4, 5]
c2.column_data = []
Run Code Online (Sandbox Code Playgroud)

用户搜索数据(t1,t2,t3是测试例):

t1.user_data = [1]
t2.user_data = [1, 3]
t3.user_data = [1, 2, 3, 4, 5]
t4.user_data = []
Run Code Online (Sandbox Code Playgroud)
  • 对于情况c1t1,t2,t4,它应该返回no match found.
  • t3,它应该导致match found.
  • 对于情况c2t1,t2,t3,它应该返回no match found.
  • 随着t4,它返回`匹配发现.

我找到了postgres_ext gem,但我无法使它工作.任何人都可以建议我如何做到这一点或建议任何替代搜索方法这样的?任何替代解决方案也欢迎.

ruby ruby-on-rails ransack

12
推荐指数
1
解决办法
564
查看次数

使用ransacker进行自定义搜索

我正在尝试向ActiveAdmin添加自定义过滤器,这些过滤器最近由Ransack提供支持.不幸的是,ransacker根本没有记录,从网上的少数资源我弄乱了以下(在用户模型中):

ransacker :full_text, formatter: ->(search) {
  ids = User.search_in_all_translated(search).map(&:id)
  ids = ids.any? ? ids : nil
} do |parent|
  parent.table[:id]
end
Run Code Online (Sandbox Code Playgroud)

search_in_all_translated方法返回一个用户数组,该数组与所有已翻译属性中的搜索字符串匹配.

在管理页面上,定义了以下过滤器:

filter :full_text_in,
  label: 'full text search',
  as: :string
Run Code Online (Sandbox Code Playgroud)

过滤器本身有效,因此过滤tom将列出所有匹配的记录.但是,滤波器输入中的值切换为["tom"].

在应用过滤器之前:

在此输入图像描述

应用过滤器后:

在此输入图像描述

任何想法如何解决这一问题?

ruby-on-rails activeadmin ransack

11
推荐指数
1
解决办法
7349
查看次数

Ransack gem选择谓词和自定义谓词名称

我对使用高级搜索搜索感到困惑.我正在尝试进行自定义搜索,其中不能选择所有表名作为搜索项,也不会使用所有谓词.我使用railscast作为教程,但我找不到任何限制谓词数量的方法.是否有可能使用不同语言(只是标签)的preicates和table字段的名称?

我的搜索表单

= search_form_for @q, :url => search_offers_path, :html => { :method => :post } do |f|
  = f.condition_fields do |c|
    .field
      = f.attribute_fields do |a|
        = a.attribute_select
      = f.predicate_select 
      = f.value_fields do |v|
        = v.text_field :value
      = link_to "#{t :destroy}", '#', class: "remove_fields"

    = link_to_add_fields "#{t :add}", f, :condition

  .field
    = t :sort
    = f.sort_fields do |s|
      = s.sort_select

  = f.submit "#{t :search}"
Run Code Online (Sandbox Code Playgroud)

我的控制器

def index
  select_offers = Offer.where { (user_id != id) & (ended == false) …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails-3 ransack

10
推荐指数
2
解决办法
5430
查看次数