2014-06-19 25 views
1

我正在嘗試爲我的索引表編寫一行,用於過濾有關特定列的特定值的我的對象。我有到現在爲止是這樣的:我的索引表中的所有屬性的搜索/過濾方法

pimps_controller.rb

def index 
    @pimps = Pimp.search(params[:search]) 
end 

pimp.rb

def self.search(search) 
    if search 
     where('title LIKE ?', "%#{search}%")  
    else 
     scoped 
    end 
end 

的視圖的一部分:

<%= text_field_tag :search, params[:search] %> 

那之後的對象標題過濾器只有這麼我試圖改變它,使其適用於可以過濾後的不同搜索字段不同的屬性。我想傳遞第二個參數值,如果有人觸發搜索功能,以確保它觸發正確的屬性。這就是我已經試過:

pimps_controller.rb

@pimps = Pimp.search(params[:search_column],params[:search]) 

pimp.rb

def self.search(search_column, search) 
    if search 
     col = "%#{search_column}" 
     s = "%#{search}%" 
     where(col 'LIKE ?', s) 
    else 
     scoped 
    end 
end 

的觀點:

<%= text_field_tag :search, params[:search], params[:search_column => title] %> 

但它不工作。我想在一個搜索字段中傳遞這兩個參數的錯誤消息。你會怎麼做?

+1

你做了什麼錯誤?這兩個參數在一個搜索領域意味着什麼? –

+0

你想在這裏做什麼?它看起來錯了。 '<%= text_field_tag:search,params [:search],params [:search_column => title]%>' –

回答

1

下面是關於如何做到這一點的簡單教程:

https://we.riseup.net/rails/simple-search-tutorial

在模型中,你將不得不使用或條件查詢添加字段。

def self.search(search) 
    search_condition = "%" + search + "%" 
    find(:all, :conditions => ['title LIKE ? OR description LIKE ?', search_condition, search_condition]) 
end 

如果要定義字段中PARAMS你可以使用字符串插值簡單引號搜索:

%Q(文本包含 「#{} search.query」)

0

您需要2個文本字段,一個用於列,一個用於值:

# view 
<%= text_field_tag :search_value, params[:search_value] %> 
<%= text_field_tag :search_column, params[:search_column] %> 

# controller 
@pimps = Pimp.search(params[:search_column], params[:search_value]) 

# Pimp model 
def self.search(search_column, search_value) 
    if search_value.present? && search_column.present? 
    column = self.column_names.include?(search_column.to_s) ? search_column : 'title' 
    value = "%#{search_value}%" 
    where("#{self.table_name}.#{column} LIKE ?", value) 
    else 
    scoped 
    end 
end 

關於這種方法的問題我如果您沒有輸入列的確切名稱,它將搜索title列中的值。我認爲你應該使用一個select_tag,列出了模型的所有搜索欄:

# view 
<%= select_tag :search_column, options_for_select(Pimp.column_names.map { |col| [col, col] }, params[:search_column]) %> 

此視圖代碼將顯示select標籤與皮條客模型的可用列。您可以輕鬆地通過皮條客定義一個類的方法限制檢索列:

# Pimp model 
def searchable_columns 
    self.column_names - ['id', 'created_at', 'updated_at'] 
end 

# view 
<%= select_tag :search_column, options_for_select(Pimp.searchable_columns.map { |col| [col, col] }, params[:search_column]) %>