لماذا يتم تحديث ActanceMent_FU كل مرفق بدلاً من مجرد تم تغييره؟

StackOverflow https://stackoverflow.com/questions/1363160

سؤال

لدي نموذج خاص مع أ has_many و accepts_nested_attributes_for على نموذج الصورة الذي يستخدم attachment_fu. يؤدي تحديث خاصية باستخدام الكود التالي إلى تحديث قاعدة البيانات لكل صورة (وكل صورة مصغرة صورة) بغض النظر عما إذا كانت هناك تغييرات عليها أم لا.

PROPERTIES_CONTROLLER.RB

  def update
    @property.update_attributes params[:property]
    redirect_to edit_property_path(@property)
  end

_form.html.erb

<% form_for @property do |property| %>  
  ...
  <ul id='image-admin'>
    <% @property.images.each do |image| %>
      <li>
      <%= image_tag image.public_filename(:front), :alt=> h(image.caption), :size => "218x160" %>
      <% property.fields_for :images, image do |img| %>
        <%= img.hidden_field :ordering, :class => 'order' %>
        <%= img.text_field :caption %>
        <span class='img_remove'>
          Remove ? <%= img.check_box '_delete' %>
        </span>
      <% end %>
      </li>
    <% end %>
  </ul>
  ...
<% end %>

إخراج البرنامج النصي/الخادم

  SQL (8.7ms)   COMMIT
  SQL (0.1ms)   BEGIN
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 103402 WHERE `id` = 350
  Image Load (0.5ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'small' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 60535 WHERE `id` = 352
  Image Load (0.5ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'front' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 39888 WHERE `id` = 353
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'thumb' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 3510 WHERE `id` = 351
  SQL (0.9ms)   COMMIT
  SQL (0.1ms)   BEGIN
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 100387 WHERE `id` = 338
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'small' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 58212 WHERE `id` = 340
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'front' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.8ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:20', `size` = 38101 WHERE `id` = 341
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'thumb' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:20', `size` = 3241 WHERE `id` = 339
  SQL (0.8ms)   COMMIT

أي أفكار لماذا (وكيف يمكنني التوقف) attachment_fu من فعل هذا؟ يبدو أنه يعتقد أن سمة الحجم قد تغيرت ولكن لا يمكنني رؤية أي سبب (في الكود الخاص بي ، أو في attachment_fu) لماذا يجب أن تفكر في ذلك.

هل كانت مفيدة؟

المحلول 2

حسنًا ، كان ينبغي علي تفتيش Stackoverflow بشكل أكثر شمولية قبل نشر هذا ، ماتشو لقد شرب المرفقات _fu وحل هذه المشكلة في السؤال 913555. استبدال واحد Technoweenie بهذا حل كل مشاكلي.

نصائح أخرى

fields_for يكرر الحقول المغلقة لكل صورة في الارتباط. لكن لديك حلقة خارجية تكرر fields_for لكل صورة في الجمعية. نتيجة لذلك عند إرسالك ، ترسل الكثير من التحديثات مما تريد إرساله.

جرب هذا:

<% form_for @property do |property| %>  
  ...
  <ul id='image-admin'>
    <% property.fields_for :images, image do |img| %>
      <li>
      <%= image_tag img.object.public_filename(:front), :alt=> h(img.object.caption), :size => "218x160" %>
        <%= img.hidden_field :ordering, :class => 'order' %>
        <%= img.text_field :caption %>
        <span class='img_remove'>
          Remove ? <%= img.check_box '_delete' %>
        </span>
      </li>
    <% end %>
  </ul>
  ...
<% end %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top