Rails 4如何按订单编号或订单状态搜索

问题描述:

我希望能够通过编号或订单状态搜索订单。 我目前的代码正在工作,但不是100%。Rails 4如何按订单编号或订单状态搜索

订单和订单状态模型之间存在has_many关系。 订单状态模型有四个条目: 1.Processing,2.Completed,3.Cancelled,4.Refunded

例子:

我有一个简单的表格,输入订单号,并用另一种形式选择标签 包含所有订单状态以按订单状态进行搜索。

如果我要寻找的顺序编号1,我得到的所有订单的ID号码1,我也得到所有与订单状态订单1.

我想获得任何订单ID的结果或订单状态。

订货型号

class Order < ActiveRecord::Base 
    belongs_to :order_status 

    def self.search(search) 
    where("cast(id as text) LIKE ? OR order_status_id LIKE ? ", "%#{search}%", "%#{search}%") 
    end 
end 

订单状态模型

class OrderStatus < ActiveRecord::Base 
    has_many :orders 
end 

订单控制器

def index 
    @order_statuses = OrderStatus.all 
    if params[:search] 
     @orders = Order.search(params[:search]) 
    else 
     @orders = Order.all 
    end 
    end 

订单指数视图

<div class="row"> 
    <div class="col-sm-6 form-group"> 
     <%= form_tag orders_path, :method => 'get', class:"" do %> 
     <p> 
      <%= text_field_tag :search, params[:search] %> 
      <%= submit_tag "Search", :name => nil, class:"btn btn-primary" %> 
     </p> 
     <% end %> 
    </div> 
     <div class="col-sm-6 form-group"> 
     <%= form_tag orders_path, :method => 'get', class:"" do %> 
     <p> 
      <%= select_tag :search, options_from_collection_for_select(OrderStatus.all, :id, :name, params[:search]) %> 
      <%= submit_tag "Search", :name => nil, class:"btn btn-primary" %> 
     </p> 
     <% end %> 
    </div> 
</div> 
<table class="table"> 
    <tr> 
     <th>Order Id</th> 
     <th>amount</th> 
     <th>status</th> 
     <th>Last Updated</th> 
     <th>manage</th> 
    </tr> 
    <% @orders.each do |order| %> 
     <tr>    
     <td><%= order.id %></td> 
     <td><%= order.total %></td> 
     <td><%= order.order_status.name %></td> 
     <td><%= order.updated_at %></td> 
     <td><%= link_to 'details', order %> | 
      <%= link_to 'edit', edit_order_path(order) %> | 
      <%= link_to 'delete', order_path(order), method: :delete, data: { confirm: 'Are you sure?' } %> 
     </td> 
     </tr> 
    <% end %> 
    <tr><td colspan="4"></td></tr> 
</table> 

我已经研究了以下链接,但我没有找到或理解的解决方案。

链接:

http://railscasts.com/episodes/37-simple-search-form?autoplay=true

http://railscasts.com/episodes/111-advanced-search-form-revised?autoplay=true

http://guides.rubyonrails.org/active_record_querying.html

Rails Search Form

Build static dropdown menu for simple search Rails 3

你可以通过两种order_idorder_status :name属性的搜索具有以下

class Order < ActiveRecord::Base 
    belongs_to :order_status 

    def self.search(query) 
    query.to_s.is_i? ? where(id: query) : joins(:order_status).where('order_statuses.name LIKE ?', "%#{query}%") 
    end 
end 

为了使用is_i?方法,你需要创建一个初始化文件,要求新String扩展文件来扩展String类

# config/initializers/core_extensions.rb 
Dir[File.join(Rails.root, "lib", "core_extensions", "*.rb")].each {|f| require f } 

,然后创建新的String扩展文件和is_i?方法

# lib/core_extensions/string.rb 
class String 
    def is_i? 
    /\A[-+]?\d+\z/ === self 
    end 
end 

信用this SO answeris_i?方法

+0

谢谢我试试看。你能帮我理解一下这个方法吗?搜索方法采用(查询)参数。这可以是任何事情,或需要查询,搜索或具体的东西?我对此感到困惑。 – Asan

+0

方法'''search'''接受一个参数'''query''',它是一个可以包含'''order_id'''或者一些处于'''order_status:name '''属性。为了做到这一点,该方法检查查询是否被格式化为数字“123”,并假定它是否尝试使用“order_id”进行搜索,如果它不是并且查询更像这个'''foo'''',然后它搜索属于''order_statuses''''''foo''''的'''orders'' ''':name'''列 – MilesStanfield

+0

感谢您的解释。我一整天都在挠头。 – Asan

没有必要将id转换为文本,然后使用like来匹配它。这应该足以得到你需要的东西。

class Order < ActiveRecord::Base 
    belongs_to :order_status 

    def self.search(search) 
    where("id = ? OR order_status_id LIKE ? ", search, "%#{search}%") 
    end 
end 
+0

演员阵容在那里,因为它使用PG数据库在生产中给我一个错误。铸造解决了问题。谢谢你的帮助。 – Asan