لماذا يتم تحديث ActanceMent_FU كل مرفق بدلاً من مجرد تم تغييره؟
-
20-09-2019 - |
سؤال
لدي نموذج خاص مع أ 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
) لماذا يجب أن تفكر في ذلك.
نصائح أخرى
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 %>
لا تنتمي إلى StackOverflow