Rails 4如何按订单ID或订单状态进行搜索

时间:2016-02-28 23:52:16

标签: ruby-on-rails ruby

我希望能够按ID或订单状态搜索订单。 我目前的代码正在运行但不是100%。

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

示例:

我有一个简单的表单来输入订单ID,另一个表单带有一个select标签 所有订单状态按订单状态搜索。

如果我搜索订单ID 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

2 个答案:

答案 0 :(得分:2)

您可以使用以下

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

is_i?方法

this SO answer

答案 1 :(得分:0)

没有必要将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