我最近有做類似的東西收集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的方式。 :)
根據他的代碼到目前爲止,我認爲他有作爲參數[作者]。所以你明白了。在rails 2.3中,我不得不這樣做:Book.all(:conditions => [「author_id IN(?)」,params [authors])...在哪裏()真的允許我這樣做,就像你在3 。X? – TomDunning
是的,這個作品完美。謝謝。我試圖讓它變得比需要的複雜。 (我會給你投票,但還不夠,代表明智。) – qalep
@qalep我很高興它確實幫了你。 –