2016-02-28 69 views
0

我希望能夠通過編號或訂單狀態搜索訂單。 我目前的代碼正在工作,但不是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

回答

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 

信用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

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 
+0

演員陣容在那裏,因爲它使用PG數據庫在生產中給我一個錯誤。鑄造解決了問題。謝謝你的幫助。 – Asan