0

我遇到查询问题。我有作用域的列表在我的模型:Rails“where”查询被忽略

class Drawing < ActiveRecord::Base 
    has_many :revisions 

    scope :by_description, lambda { |description| where('description LIKE ?', "%#{description}%") unless description.nil? } 
    scope :by_drawing_number, lambda { |drawing_number| where('drawing_number LIKE ?', "%#{drawing_number}%") unless drawing_number.nil? } 
    scope :by_item_number, lambda { |item_number| where('item_number LIKE ?', "%#{item_number}%") unless item_number.nil? } 
    scope :by_pump_model, lambda { |pump_model| where('pump_model LIKE ?', "%#{pump_model}%") unless pump_model.nil? } 
    scope :by_frame_size, lambda { |frame_size| where('frame_size LIKE ?', "%#{frame_size}%") unless frame_size.nil? } 
    scope :by_part_type, lambda { |part_type| where('part_type LIKE ?', "%#{part_type}%") unless part_type.nil? } 
    scope :by_created_before, lambda { |created_before| where('created_at <= ?', created_before) unless created_before.nil? } 
    scope :by_created_after, lambda { |created_after| where('created_at >= ?', created_after) unless created_after.nil? } 

而且我在index动作控制器呼吁他们:

def index 

    @drawings = Drawing.by_description(params[:drawings][:description]).by_drawing_number(params[:drawings][:drawing_number]).\ 
     by_item_number(params[:drawings][:item_number]).by_pump_model(params[:drawings][:pump_model]).by_frame_size(params[:drawings]\ 
     [:frame_size]).by_part_type(params[:drawings][:part_type]).by_created_before(params[:drawings][:created_before]).\ 
     by_created_after(params[:drawings][:created_after]).all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @drawings } 
    end 
    end 

所有查询的工​​作,我可以用它们来筛选除了by_created_before和by_created_after作用域以外,通过任何给定变量进行搜索。 params散列显示已输入搜索的日期,但输出的查询不包含这两个范围。这里是日志的一个片段:

Started GET "/drawings?utf8=%E2%9C%93&drawings%5Bdescription%5D=&drawings%5Bdrawing_number%5D=&drawings%5Bitem_number%5D=&drawings%5Bpump_model%5D=&drawings%5Bframe_size%5D 
e%5D=&drawings%5Bcreated_before%281i%29%5D=&drawings%5Bcreated_before%282i%29%5D=&drawings%5Bcreated_before%283i%29%5D=&drawings%5Bcreated_after%281i%29%5D=2013&drawings%5B 
%5D=5&drawings%5Bcreated_after%283i%29%5D=2&commit=Search" for 127.6.43.1 at 2013-08-31 16:49:56 -0400                  
Processing by DrawingsController#index as HTML                                
    Parameters: {"utf8"=>"✓", "drawings"=>{"description"=>"", "drawing_number"=>"", "item_number"=>"", "pump_model"=>"", "frame_size"=>"", "part_type"=>"", "created_before(1i 
re(2i)"=>"", "created_before(3i)"=>"", "created_after(1i)"=>"2013", "created_after(2i)"=>"5", "created_after(3i)"=>"2"}, "commit"=>"Search"}         
    Drawing Load (0.6ms) SELECT "drawings".* FROM "drawings" WHERE (description LIKE '%%') AND (drawing_number LIKE '%%') AND (item_number LIKE '%%') AND (pump_model LIKE '% 
IKE '%%') AND (part_type LIKE '%%')                                   
    Rendered drawings/index.html.erb within layouts/application (11.4ms)                          
Completed 200 OK in 291ms (Views: 86.7ms | ActiveRecord: 0.6ms) 

我也试着只用

lambda {|created_before| where(:created_at <= created_before)...} 

感谢您的指教!

回答

0

这是我能工作到解决问题。 pdobb说得不得不将3个参数放在一个字符串中,或​​者分别处理它们。这是我更新的模型:

class Drawing < ActiveRecord::Base 
    has_many :revisions 

    scope :by_description, lambda { |description| where('description LIKE ?', "%#{description}%") unless description.nil? } 
    scope :by_drawing_number, lambda { |drawing_number| where('drawing_number LIKE ?', "%#{drawing_number}%") unless drawing_number.nil? } 
    scope :by_item_number, lambda { |item_number| where('item_number LIKE ?', "%#{item_number}%") unless item_number.nil? } 
    scope :by_pump_model, lambda { |pump_model| where('pump_model LIKE ?', "%#{pump_model}%") unless pump_model.nil? } 
    scope :by_frame_size, lambda { |frame_size| where('frame_size LIKE ?', "%#{frame_size}%") unless frame_size.nil? } 
    scope :by_part_type, lambda { |part_type| where('part_type LIKE ?', "%#{part_type}%") unless part_type.nil? } 
    scope :by_created_before, lambda { |x,y,z| 
    d=Date.new(x.to_i, y.to_i, z.to_i) 
    d.to_s 
    where('created_on <= ?', d) unless d.nil? } 

    scope :by_created_after, lambda { |x,y,z| 
    d=Date.new(x.to_i, y.to_i, z.to_i) 
    d.to_s 
    where('created_on >= ?', d) unless d.nil? } 

,并与整个查询的最后行动:

def index 

    @drawings = Drawing.by_description(params[:drawings][:description]).by_drawing_number(params[:drawings][:drawing_number]).\ 
     by_item_number(params[:drawings][:item_number]).by_pump_model(params[:drawings][:pump_model]).by_frame_size(params[:drawings]\ 
     [:frame_size]).by_part_type(params[:drawings][:part_type]).by_created_before(params[:drawings]['created_before(1i)'], params[:drawings]['created_before(2i)'], params[:drawings]['created_before(3i)']).\ 
     by_created_after(params[:drawings]['created_after(1i)'], params[:drawings]['created_after(2i)'], params[:drawings]['created_after(3i)']).all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @drawings } 
    end 
    end 

我知道这是不是最优雅的查询,因为我结束了很长的URL,但它的工作并正确查询我的模型。

0

“params哈希表被示出已经输入到查询的时间”。

这是哪里出呢?

如果我在URL解码器解码参数我得到“/图纸?UTF8 =✓&附图[描述] = &附图[drawing_number] = &附图[伊特m_number] = &附图[pump_model] = &附图[created_before(1i)] = & drawing [created_before(2i)] = & drawing [created_after(3i)] = & drawing [created_after(1i)] = 2013 & drawings [] = 5个&附图[created_after的(3R)] = 2 &提交=搜索”

修复输入后,必须在数据库进行比较之前将字符串转换为日期。像Datetime.parse东西PARAMS [:图纸] [:created_before]

1

这是因为你的created_atcreated_before PARAMS通过多个PARAMS进来 - 看到你的日志Parameters:节还有。月,日和年进来特殊(2i)(3i)(1i) PARAMS。这是date_select助手的典型代表。在使用批量分配时,Rails会把这个日期放回到一个单一的字符串中,就像你期待的那样...但是在这里你必须自己做。

快速建议:

如果这是你将要消耗来自形式之日起,使用select_date instead of date_select作为PARAMS会更容易理解和再解析回到一起到一个单一的唯一途径日期字符串。或者,如果可能,只需使用text_field。与日期选择用户界面(日历界面,或其他)相结合,这并不像看起来那么糟糕,而且它的好处是不会允许无效的日期,如2月31日。

一切的一切,你只需要找出其中的则params的是它并传递到你的范围前,他们插值到日期看串,你应该设置。