массовое обновление объектов с использованием формы в рельсах - PullRequest
2 голосов
/ 02 октября 2009

У меня есть модель человека и модель цитаты. У каждого человека может быть много цитат, связанных с ним, которые в свою очередь имеют такие вещи, как Автор, Текст, URL, связанный с ними. На практике только у одного человека есть объект кавычек, но потенциально у всех может быть один.

Я пытаюсь использовать простой, умеренный инструмент для цитат. Как, например, пользователи могут вводить кавычки, а администратор может пойти и получить все кавычки конкретного человека (но, как на практике, только у одного они будут) и установить флажок, который устанавливает логическое значение, одобренное 0 или 1. на самом деле отображаются кавычки, они фильтруются этим полем.

Я действительно запутался, пытаясь создать форму, которая обновит их все оптом. Я получил форму, чтобы отобразить их все так:

<% form_for :quotes, :html => { :method => :put }, :url => {:controller => "quote", :action => "bulk_update", }  do |quote_form| %>
   <% @person.quotes.each do |quote| %>
<p>
   <% fields_for "quotes[id][]", quote  do |fields| %>
           Text....
           <%= fields.check_box :approved %><br><br>

  <% end %>
</p>

<% end %>
<%= submit_tag 'Update' %>
<% end %>

У меня просто невероятно общий элемент в контроллере массовых обновлений, который в основном похож на обычный контроллер обновлений. Я не уверен, что туда положить. Я мог бы попытаться поместить все кавычки, которые я, вероятно, должен, но я все равно не знаю, как добраться до этой переменной, потому что я делаю все это из представления Person и т. Д. Контроллер выглядит примерно так:

def bulk_update
@quote = Quote.find(params[:id])
end

Полагаю, я запутался в том, что удостоверение личности должно быть там и что должно быть передано. Должен ли удостоверение личности быть частью этого вообще? Как я уже сказал, мне все равно, если технически все цитаты отображаются на этой странице, их не нужно сортировать по пользователю.

Я получаю параметры, которые выглядят так:

"quotes" => {"id" => {"6" => {"Approved" => "0"}, ..

но он жалуется на то, что не может найти цитату без идентификатора. Меня не волнует идентификатор, так как я хочу массово обновить их все. Кажется, что эта конкретная структура будет отображать несколько идентификаторов, но, возможно, (вероятно) мне придется изменить свой контроллер, чтобы компенсировать это, хотя я не уверен, как. Это также не работает, когда я пытаюсь удалить кавычки, часть хэша, и просто "id" => {"6" => {"Approved" => "0"}, .. в качестве моих параметров.

РЕДАКТИРОВАТЬ: Я нашел заявление под названием update_all, но я не знаю, как выборочно передать ему то, что мне нужно ...

Ответы [ 3 ]

4 голосов
/ 02 октября 2009

Я обнаружил, что следующий подход является гибким, особенно для обработки ошибок:

def bulk_update
  quotes = params["quotes"]["id"]
  quotes.each do |quote_id,quote_attrs|
    quote = Quote.find(quote_id)
    quote.update_attributes(quote_attrs)
    # Other logic of interest like error handling
    # . . .
  end
  # Don't forget to render or redirect to the proper view
end

Обновление

Правильный способ сделать это - переместить логику обновления в модель:

class QuotesController < ApplicationController
  def bulk_update
    errors = Quote.bulk_update(params["quotes"]["id"])
    # Other logic of interest like error handling
    # . . . 
    # Don't forget to render or redirect to the proper view
  end
end

class Quote < ActiveRecord::Base
  def bulk_update
    errors = {}
    quotes.each do |quote_id,quote_attrs|
      quote = Quote.find(quote_id)
      unless quote.update_attributes(quote_attrs)
        errors[quote_id] = qoute.errors
      end 
    end
    errors
  end
end
0 голосов
/ 02 марта 2013

Посмотрев на этот код:

def bulk_update
  quotes = params["quotes"]["id"]
  quotes.each do |quote_id,quote_attrs|
    quote = Quote.find(quote_id)
    quote.update_attributes(quote_attrs)
  end
end

Я подумал, что может быть более кратким сделать именно это:

Quote.where(:condition => "value").collect{|x| x.update_attributes(quote_attrs)}
0 голосов
/ 17 декабря 2012

Я бы сделал что-то подобное:

def self.bulk_update(attributes)
  where(id: attributes.keys).each_with_object({}) do |quote, errors| 
   unless quote.update_attributes(attributes["#{quote.id}"])}
     errors["#{quote.id}"] = entry.errors
   end
end

В этом методе вы загружаете только соответствующие кавычки.

Григорий Горион -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...