2012-07-02 70 views
1

這看起來應該是一個常見問題,但我無法找到答案。基本上我想要一個有10個左右複選框的表格,我正在用創建。提交表單時,我想生成一個查詢,返回所有匹配任何選中選項的記錄。所以,檢查選擇的數量會有所不同。rails OR基於多個複選框選擇的查詢

因此,舉例來說,如果我有

class Book < ActiveRecord::Base 
    belongs_to :author 
end 

我想產生類似

Book.where("author_id = ? or author_id = ?", params[authors[0]], params[authors[1]])如果有兩個箱子託運等

感謝任何見解。

回答

4

這項工作適合你嗎?

Book.where(author_id: [array_of_author_ids]) 

你需要從PARAMS第一

+0

根據他的代碼到目前爲止,我認爲他有作爲參數[作者]。所以你明白了。在rails 2.3中,我不得不這樣做:Book.all(:conditions => [「author_id IN(?)」,params [authors])...在哪裏()真的允許我這樣做,就像你在3 。X? – TomDunning

+0

是的,這個作品完美。謝謝。我試圖讓它變得比需要的複雜。 (我會給你投票,但還不夠,代表明智。) – qalep

+0

@qalep我很高興它確實幫了你。 –

0

我最近有做類似的東西收集author_ids,我這是怎麼實現這一點。這很聰明(至少我是這麼認爲的:))

我創建了一個查詢模型,用JSON序列化查詢列(文本字段)。我使用表單從具有選擇字段的用戶獲取查詢數據。

class BookQuery < ActiveRecord::Base 
    has_many :books 



    # loop through each foreign key of the Book table and create a hash with empty selection 
    def self.empty_query 
    q = {} 
    Book.column_names.each do |column_name| 
     next unless column_name.ends_with?("_id") 
     q.merge column_name => [] 
    end 
    end 
end 

我使用的是作者如下的例子: <%=的form_for @book_query做| F | %> <%用於Author.all%> <%= check_box_tag 「book_query [查詢] [author_ids] []」,author.id,假%> <%= author.name%> <%端作者%> <%= f.submit「保存查詢」%> <%結束%>

當表單提交你結束了這樣的參數: 當表單提交它生成此參數:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXXXXXXXXXX", "book_query"=>{"query"=>{"author_ids"=>["2", "3"]}}, "commit"=>"Save Query"} 

現在在BookQuery控制器的創建操作,你可以做什麼創建函數總是這樣:

def create 
    @book_query = BookQuery.build(params[:book_query]) 
    if @book_query.save 
    flash[:success] = "Book query successfully saved." 
    redirect_to ... 
    else 
    flash[:error] = "Failed to save book query." 
    render :new 
    end 
end 

但默認情況下軌連載中的散列類型的數據:

1.9.3p194 :015 > pp BookQuery.find(9).query 
BookQuery Load (0.7ms) SELECT "book_queries".* FROM "book_queries" WHERE "book_queries"."id" = $1 LIMIT 1 [["id", 9]] 
"--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nauthor_ids:\n- '2'\n- '3'\n" 
=> "--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nauthor_ids:\n- '2'\n- '3'\n" 

在BookQuery模型,添加以下:

serialize :query, JSON 

但鐵路將改變ID,以字符串:

1.9.3p194 :018 > query = JSON.parse(BookQuery.find(10).query) 
BookQuery Load (0.5ms) SELECT "book_queries".* FROM "book_queries" WHERE "book_queries"."id" = $1 LIMIT 1 [["id", 10]] 
=> {"author_ids"=>["2", "3"]} 
1.9.3p194 :019 > query["author_ids"] 
=> ["2", "3"] 

我做了什麼,然後是覆蓋BookQuery模型的屬性訪問器:

下有許多工作要做,因爲哈希返回一個字符串,在整數IDS。

def query=(query) 
    query.each_pair do |k, v| 
    if query[k].first.present? 
     query[k].map!(&:to_i) 
    else 
     query.except!(k) 
    end 
    end 
    write_attribute(:query, query) 
end 

# just want to avoid getting nil query's 
def query 
    read_attribute(:query) || {} 
end 

要與此查詢找到的書,你可以在這個函數簡單地添加到您的Book模型:

def self.find_by_book_query(book_query, options = {}) 
    options[:conditions] = book_query.query 
    find(:all, options) 
end 

現在你得到一個基於模型定義手冊自定義的查詢字符串和一切工作像Rails的方式。 :)

+0

負載是多餘的。如果你是si – TomDunning

+0

對不起,你的評論似乎是切斷。什麼是更好的方式來做到這一點? – yuklai

+0

您好fatshu,對不起,它被切斷了,因爲我昨晚將它寫在我的iphone上後刪除它,不能。 很多東西都是多餘的......在這個場景中,我打算刪除我的評論,因爲你在這裏給出的是針對你面臨的問題(而不是上面的問題)。對於這個問題 - 如果他想保存查詢 - 你只能將作者存儲爲序列化,而不是JSON風格。然後就像上面的阿爾珀一樣把它塞進一個發現。 再次:道歉,你的情況的偉大代碼,而不是這個問題。 – TomDunning