使用Ransack在日期字段中搜索年份

时间:2018-01-20 00:15:53

标签: ruby-on-rails ransack

如何使用Ransack在日期字段中搜索特定的(出生日期)年份?

目前代码如下:

控制器

J = [-x.^b -a.*x.^b.*log(x)]

视图

    tests/pdf2svg/pdf2svg.c:24:10: fatal error: 'glib.h' file not found
    #include <glib.h>
             ^~~~~~~~
    1 error generated.
    ERROR:root:compiler frontend failed to generate LLVM bitcode, halting

以上似乎没有进行任何过滤,很可能是因为我将字符串与日期进行比较?

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

对于ransack,您需要在模型中使用Arel来处理字符串和Datetime的转换:

ransacker :birthdate_cont do
  Arel.sql('date(birthdate_cont)')
end

另外,我觉得两个字段允许在两个日期(开始和结束)之间进行选择将是更好的选择。

在此处阅读更多内容:https://github.com/activerecord-hackery/ransack/wiki/using-ransackers#2-convert-a-user-string-input-and-a-database-datetime-field-to-the-same-date-format-to-find-all-records-with-a-datetime-field-created_at-in-this-example-equal-to-that-date-

现在,在Ransack之外(如果编写自己的搜索方法),如果搜索是您的运动员课程中的课程方法:

首先,如果是文本字段,则需要指定格式。您可以使用DateTime.parse并使用它。

其次,对于搜索,您可以获取该输出并创建一个新的DateTime对象,如:

User.where(:birthdate => Datetime.new(2018, 01, 10, 22, 37, 2 ))

但是我觉得你的查询应该在该特定日期搜索位于00:00:00和23:59:59之间的任何DateTime 如果你使用DateTime而不是Date作为实体类型(这将是如果您正在为数据库使用最佳实体类型,那么这是一个值得思考的好地方)。所以查询可能就像;

您的搜索类方法中的

User.where(:birthdate => Datetime.new(2018, 01, 09, 0, 0, 0)..Datetime.new(2018, 01, 10, 23, 59, 59 ))。为了实现这一点,我假设搜索是一种类方法,您可以根据参数进行更改。

答案 1 :(得分:0)

如果您有datetime列和日期输入,例如dd/mm/yyyy,则可以使用此ransacker:

# your_model.rb
ransacker :created_on, formatter: proc { |value| Date.parse(value).strftime('%Y-%m-%d') } do
  Arel.sql("DATE(#{table_name}.created_at)")
end

给出输入日期01/10/2018,它的搜索方式如下:

SELECT * FROM table WHERE DATE(table.created_at) = '2018-10-01'