2015-10-27 65 views
0

我有用於搜索特定模型(訂單)的搜索表單。它工作正常,但我想添加在我的搜索方法從一個協會(交易),這樣嵌套參數:[「params」] [「transaction_id」]。與下面的代碼,我得到一個錯誤ActiveRecord::StatementInvalid in Orders#index,因爲我不能用正確的方式表達它。我怎樣才能解決這個問題?如何從Rails關聯中獲取屬性

型號:

​​

控制器:

def index 
    @orders = Order.search(params) 
end 

查看:

<%= form_tag orders_path, :method => 'get' do %> 
    <p> 
    <%= text_field_tag :search, params[:search],id: "search_text", placeholder: " Search order" %> 
    <%= submit_tag "Search", :name => nil, class: "btn btn-success", id: "search_but_order" %> 
    </p> 
<% end %> 

解決方案 正如@Lanny Bose建議我,我爲我的Order模型創建了一個新列,並將序列化參數的值傳遞給它。通過這種方式,我現在可以將其添加到我的搜索方法中。

+0

你的意思是你要搜索該事務的id屬性? –

+0

是的,但它在關聯模型'交易'中並且是嵌套的。 –

+0

然後你想'transactions.id'不是'params.transaction_id' –

回答

1

在我開始之前,你必須在Order.search一個邏輯錯誤。你設置了兩次query =,這意味着你只是在另一個上寫一個查詢。你想鏈接在一起。

至於如何構建查詢,你是在正確的軌道上。

型號

def self.search(term) 
    if term 
    Order.order('created_at DESC').joins(:transactions).where("name LIKE :t OR email LIKE :t", t: term) 
    else 
    nil 
    end 
end 

注意新的語法各地:t。 Rails稱此佔位符條件爲in the Rails Guide,這意味着您不必一遍又一遍地複製搜索變量。

此外,我意識到我只與nameemail比較。我會讓你輸入你的其他領域。 :)

編輯

對不起,我忘了拼了這一點。我會在控制器中執行參數處理,所以我只是將一個字符串傳遞給模型。

控制器

@orders = Order.search(params[:search]) 

...這是絕對的風格超過物質的問題,我相信。

+0

Nice and DRY your code but it does not work 。另外我的問題是如何訪問[「params」] [「transaction_id」]。 –

+0

我做了一個編輯。如果它仍然不適合你,你能更具體地瞭解出現的錯誤嗎? –

+0

'每個nil:NilClass'都有未定義的方法。在我看來,我遍歷我的@orders變量。似乎是在這一行'<%@ orders.each do | order | %>' –

0

嘿,你可以嘗試這種方式。

yml_str = {:transcation_id => params[:search] }.to_yaml.gsub("-","").squish 
:如果列是序列化,那麼你可以通過你的檢索串在你需要爲你seriallize在商店

的時候就可以使用YAML作爲創建字符串創建相同的散列這種情況下,之前使用.to_yaml轉換器

您可以使用.squishgsub方法從字符串

刪除不需要的---\n簡單地從特定的列的查詢作爲

Order.includes(:transactions).where("order_transactions.params like ?", "%#{yml_str}%") 

你的方法

def self.search(params) 

    query = order('created_at DESC').joins(:transactions) 
    query = query.where('name LIKE ? OR email LIKE ? OR phone LIKE ? OR address1 LIKE ? OR state LIKE ? OR city LIKE ? OR order_transactions.params LIKE ?', "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%", "%#{yml_str}%").order('created_at DESC') if params[:search].present? 
    query 
    end 
0

您是否考慮使用示波器?

class Order < ActiveRecord::Base 
    scope :name, -> (name) { where("name like ?", "#{name}%")} 
    scope :email, -> (email) { where("email LIKE ?", "#{email}%")} 
    scope :phone, -> (phone) { where("phone LIKE ?", "#{phone}%")} 
    scope :address1, -> (address1) { where("address1 LIKE ?", "#{address1}%")} 
    scope :state, -> (state) { where("state LIKE ?", "#{name}%")} 
    scope :city, -> (city) { where("city LIKE ?", "#{city}%")} 

    scope :custom, -> (field, value) { where("#{field} LIKE ?", "#{value}%")} 

end 

現在,我們可以解決嵌套PARAMS問題的方式如下:

q=params[:search] 
if q.present? 
    result = Order.name(q).or.email(q).or.phone(q).or.address1(q).or.state(q).or.city(q) 
    if params[:nested_query] 
     hash.each do |key, value| 
      result=result.or(key,value) 
     end 
    end 
end 
+0

我從未使用示波器。我會嘗試它,我會讓你知道。 –