Rails 4 - Как использовать Update_all с этим хэшем params?

У меня есть модель под названием Row:

# == Schema Information
#
# Table name: rows
#
#  id         :integer          not null, primary key
#  created_at :datetime
#  updated_at :datetime
#  numCols    :integer
#  type       :string(255)
#  content    :text
#  status     :string(255)
#  doc_id     :integer
#

class Row < ActiveRecord::Base
    belongs_to :doc, :foreign_key => "doc_id", :class_name => "Doc"

=begin
Status of a row can be:
1) header
2) body
3) ignore
=end

Вот некоторые подходящие методы из моего row_controller:

 def update_multiple
    puts "update multiple"
    puts "#{row_params.inspect}"
    #How to use Update ALL
    #Row.update_all(row_params[:rows])
    redirect_to docs_path
  end

def row_params
      #params[:row]
        params.permit(:row, :rows =>[:id, :status, :content])
    end

Row_params, отправленные из формы в метод update_multiple, выглядят так:

   Parameters: {"utf8"=>"✓", "authenticity_token"=>"72nyykQ3uOL+VSicBk99HOtyCDpqDe4FaLzOa6EILYI=", "commit"=>"Update Row Classification", 
"rows"=>{"1"=>{"id"=>"1", "status"=>"ignore", "content"=>"[PROGRAMS] (All Locations|Consolidated),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"}, 

"2"=>{"id"=>"2", "status"=>"header", "content"=>",,,,,,,,Stats >>,Rtg%,,,,,,,,,,,,,,,Shr% [Total TV Eng],,,,,,,,,,,,,,,#Stations,,,,,,,,,,,,,,"}, 

"3"=>{"id"=>"3", "status"=>"header", "content"=>"Areas,Program,Channel,Date,Weekday,Start time,End time,Duration,Episode Name,Ind.2+,A18+,A25-54,A18-49,A18-34,A55+,F25-54,F18-49,F18-34,M25-54,M18-49,M18-34,A12-34,T12-17,C2-11,Ind.2+,A18+,A25-54,A18-49,A18-34,A55+,F25-54,F18-49,F18-34,M25-54,M18-49,M18-34,A12-34,T12-17,C2-11,Ind.2+,A18+,A25-54,A18-49,A18-34,A55+,F25-54,F18-49,F18-34,M25-54,M18-49,M18-34,A12-34,T12-17,C2-11"},

....

Я хочу обновить все строки, включенные в параметры, значениями, отправленными в методе update_multiple, показанном выше

Как мне это сделать? Я не совсем понимаю

Большое спасибо за вашу помощь.

1 ответ

Как вы можете видеть из документов, вам нужно указать, какие строки вы хотите обновить, а затем внедрить его с теми же данными (или вычислениями, как number = number + 1где число является собственностью). Но в вашем случае значения отличаются, поэтому вы должны найти строки и отдельно установить значения.

В твоем случае у тебя это должно быть вроде:

rows = Row.find(row_params[:rows].map { |r| r[:id] })
rows.each { |r| r.update(row_params[:rows]) }
Другие вопросы по тегам