রেলস: আপডেট_ট্রিবিউট বনাম আপডেট_অ্যাট্রিবিউটস


255
Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")

এ দু'টিই স্পষ্টভাবে আপডেট করতে এআরকে না বলে কোনও অবজেক্ট আপডেট করবে।

রেলস এপিআই বলেছেন:

আপডেট_ট্রিবিউটের জন্য

একটি একক অ্যাট্রিবিউট আপডেট করে এবং সাধারণ বৈধকরণ প্রক্রিয়া ছাড়াই রেকর্ডটি সংরক্ষণ করে। এটি বিদ্যমান রেকর্ডে বুলিয়ান পতাকাগুলির জন্য বিশেষত কার্যকর। বেইজে নিয়মিত আপডেট_ট্রিবিউট পদ্ধতিটি বৈধকরণ মডিউলটিতে মিশ্রিত হলে এটি এর সাথে প্রতিস্থাপিত হয় যা এটি পূর্বনির্ধারিত।

আপডেট_অ্যাট্রিবিউটের জন্য

পাস-হ্যাশ থেকে সমস্ত বৈশিষ্ট্য আপডেট করে এবং রেকর্ডটি সংরক্ষণ করে। যদি অবজেক্টটি অবৈধ হয় তবে সংরক্ষণ ব্যর্থ হবে এবং মিথ্যাটি ফিরে আসবে।

সুতরাং আমি যদি অবজেক্টটি বৈধ করতে চাই না তবে আমার আপডেট_ট্রিবিউট ব্যবহার করা উচিত। আমার যদি এই আপডেটটি একটি পূর্ববর্তী সংরক্ষণে থাকে তবে তা কি স্ট্যাকওভারফ্লো হবে?

আমার প্রশ্নটি হল আপডেট_ট্রিবিউটে সংরক্ষণ বা কেবলমাত্র বৈধতার আগে বাইপাস করা।

এছাড়াও, আপডেট_অ্যাট্রিবিউটে একটি হ্যাশ পাস করার সঠিক বাক্য গঠন কী ... উপরে আমার উদাহরণটি দেখুন।


আপনি কেন update_attributeএকটি before_saveকলব্যাকের ভিতরে একটি বিবৃতি রাখতে চান ? আমি এর কোনও ভাল কারণ ভাবতে পারি না।
ড্যানিয়েল পাইটস্ক

1
আমার কাছে অবজেক্টস রয়েছে যা আপডেট হওয়া সামগ্রীর পরিমাণের ভিত্তিতে আপডেট করা দরকার। এর চেয়ে ভাল উপায় কী?
ততদিনে

আমি কি ঠিক বলেছি, আপনাকে যে জিনিসগুলি আপডেট করতে হবে তা হ'ল আপনি যে বস্তুর সংরক্ষণ করছেন তার বৈশিষ্ট্যগুলি are যদি হ্যাঁ, তবে আপনি কেবল সেগুলি সেট করতে পারতেন এবং যে কোনও উপায়ে সেভ করা বস্তুর সাথে সেগুলি আপডেট করা হবে (কারণ সেগুলি before_saveকলব্যাকের মধ্যে সেট করা আছে )। Fe পরিবর্তে update_attribute(:discount, 0.1) if amount > 100আপনি করতে পারেন discount = 0.1 if amount > 100। অবজেক্টকে update_attributeকল saveকরে, যা এই ক্ষেত্রে অপ্রয়োজনীয়, যেহেতু বিবৃতিটি before_saveকলব্যাকের অভ্যন্তরে রয়েছে এবং যাইহোক সেভ হবে। আমি আশা করি যে এটি উপলব্ধি করে।
ড্যানিয়েল পাইটসচ :19

হ্যা এবং না. যাইহোক, আপনি যে অবজেক্টগুলির উল্লেখ করছেন তার স্থিতি অন্যান্য অবস্থার উপর নির্ভরশীল যা সংরক্ষণের আগে প্রক্রিয়া করা যায় না।
ততেনগাহ

3
একটি নোট হিসাবে, এই পদ্ধতিগুলি বৈধতা এড়িয়ে চলেছে তবে তবুও কল-ব্যাকগুলি সম্পাদন করবে , পরের_সেভের মতো ...
রজারডপ্যাক

উত্তর:


328

দয়া করে দেখুন update_attribute। শো উত্স ক্লিক করার পরে আপনি নিম্নলিখিত কোড পাবেন

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614:       def update_attribute(name, value)
2615:         send(name.to_s + '=', value)
2616:         save(false)
2617:       end

এবং এখন রেফারেন্স করুন update_attributesএবং এটির কোডটি পান

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621:       def update_attributes(attributes)
2622:         self.attributes = attributes
2623:         save
2624:       end

উভয়ের মধ্যে পার্থক্যটি update_attributeব্যবহারগুলি save(false)যেখানে আপনি update_attributesব্যবহার saveকরতে পারেন বা বলতে পারেন save(true)

দীর্ঘ বিবরণের জন্য দুঃখিত তবে আমি যা বলতে চাই তা গুরুত্বপূর্ণ। save(perform_validation = true), যদি perform_validationএটি মিথ্যা হয় তবে এগুলি সম্পর্কিত সমস্ত বৈধতাগুলি বাইপাস করে (স্কিপগুলি সঠিক শব্দ হবে) save

দ্বিতীয় প্রশ্নের জন্য

এছাড়াও, আপডেট_অ্যাট্রিবিউটে একটি হ্যাশ পাস করার সঠিক বাক্য গঠন কী ... উপরে আমার উদাহরণটি দেখুন।

আপনার উদাহরণটি সঠিক।

Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")

অথবা

Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"

অথবা যদি আপনি একটি হ্যাশের সমস্ত ক্ষেত্রের ডেটা ও নাম পান তবে params[:user]এখানে ঠিক ব্যবহার করুন

Object.update_attributes(params[:user])

7
Callbacks সম্পর্কে আপনার বিবৃতিতে অন্তত ভুল Rails 3। এটি উত্সের মন্তব্যে খুব স্পষ্টভাবে বলেছে যে "কলব্যাকগুলি চাওয়া হয়েছে"।
ব্যাটকিনস

@ ব্যাটকিন্স যা বলে তা আমি দ্বিতীয়
রাফ

3
@ ব্যাটকিনস এখনও বৈধতা চালানো হয় না - এটি সবচেয়ে গুরুত্বপূর্ণ অংশ :)
টাইগ্রেন

1
উপরের লিঙ্কগুলি কমপক্ষে রেল 5.1 এর মতো আর সঠিক নয় । এই পদ্ধতিগুলি অ্যাক্টিভেকর্ড :: দৃistence়তায় সরানো হয়েছিল। আপনি আপডেট করা তথ্য এখানে পেতে পারেন: হালনাগাদ অ্যাট্রিবিউট এবং এখানে update_attributes নোট: update_attributesএখন জন্য উপনাম হলupdate
tgf

74

টিপ: কমিট a7f4b0a1 এরupdate_attribute মাধ্যমে রেল 4 এ অবহেলা করা হচ্ছে । এটি update_attributeপক্ষে সরিয়ে দেয় update_column


45
এটি আর সত্য নয়; পদ্ধতিটি আবার যুক্ত করা হয়েছে। দেখুন github.com/rails/rails/pull/6738#issuecomment-39584005
ডেনিস

20
update_attributeবৈধতা এড়িয়ে যায়, তবে update_column:updated_atupdate
কলব্যাককে

2
তারা ইতিমধ্যে তাদের মন আপ করা হবে? রিসেট_ক্যালোম, আপডেট_কলামটিও হ্রাস পেয়েছে।
আহ্নবিজক্যাড

2
update_columnঅবহেলিত নয়, তবে update_columns(name: value)অনুগ্রহ করে। reset_columnবক্সচভডট্যশঞ.
ওব্রী

15

update_attribute

এই পদ্ধতিটি মডেল ভিত্তিক বৈধতা না চালিয়ে অবজেক্টের একক বৈশিষ্ট্য আপডেট করে।

obj = Model.find_by_id(params[:id])
obj.update_attribute :language, java

update_attributes

এই পদ্ধতিটি একক বস্তুর একাধিক বৈশিষ্ট্য আপডেট করে এবং মডেল ভিত্তিক বৈধতাও পাস করে।

attributes = {:name => BalaChandar”, :age => 23}
obj = Model.find_by_id(params[:id])
obj.update_attributes(attributes)

সক্রিয় রেকর্ডের কোন পদ্ধতিটি কখন ব্যবহার করবেন তা এই উত্তরটি পরিষ্কার হয়ে যাবে আশা করি।


12

আরও লক্ষণীয় যে, এর সাথে update_attributeআপডেট করার জন্য পছন্দসই বৈশিষ্ট্যটিকে সাদা তালিকাভুক্ত করার দরকার নেই attr_accessibleএটি ভর অ্যাসাইনমেন্ট পদ্ধতির বিপরীতে update_attributesযা কেবলমাত্র attr_accessibleনির্দিষ্ট বৈশিষ্ট্যগুলি আপডেট করবে update


8

update_attributeকেবলমাত্র একটি মডেলের কেবলমাত্র একটি বৈশিষ্ট্য আপডেট করে তবে আমরা update_attributesপদ্ধতিতে একাধিক বৈশিষ্ট্য পাস করতে পারি ।

উদাহরণ:

user = User.last

#update_attribute
user.update_attribute(:status, "active")

এটি বৈধতা পাস

#update_attributes
user.update_attributes(first_name: 'update name', status: "active")

বৈধতা ব্যর্থ হলে এটি আপডেট হয় না।


খুব ভাল ব্যাখ্যা করা হয়েছে। ধন্যবাদ!
দিয়েগো সোমার

6

দুর্দান্ত উত্তর। লক্ষ করুন যে রুবি ১.৯ এর উপরে এবং তারপরে আপনি আপডেট_িট্রিবিউটের জন্য নতুন হ্যাশ সিনট্যাক্সটি ব্যবহার করতে পারেন (এবং আমার মনে হয়):

Model.update_attributes(column1: "data", column2: "data")

6

আপনার কোনও অ্যাট্রিবিউট বা আপডেট রেকর্ড নির্ধারণের সমস্ত সম্ভাব্য উপায় (ব্লগ 4 এ আপডেট হওয়া) সম্পর্কিত http://www.davidverhasselt.com/set-attributes-in-activerecord/ সম্পর্কিত এই ব্লগ পোস্টটি দেখতে আগ্রহী হতে পারেনupdate_attribute, update, update_column, update_columns etc. । উদাহরণস্বরূপ এটি চলমান বৈধতাগুলি, অবজেক্টের আপডেটড_এটি স্পর্শ করা বা কলব্যাকগুলি ট্রিগার করার মতো দিকগুলিতে পৃথক।

ওপির প্রশ্নের উত্তর হিসাবে update_attribute কলব্যাকগুলি দিয়ে যায় না।


হ্যাঁ নিশ্চিত, আমি উত্তরটি পরিবর্তন করেছি। সাহায্য করার জন্য ধন্যবাদ.
অ্যাডাম্লিস্কো

4

update_attributeএবং update_attributesএকই, তবে একটি বড় পার্থক্য: update_attribute না বৈধতা চালায় ।

এছাড়াও:

  • update_attributeএকক বৈশিষ্ট্য সহ রেকর্ড আপডেট করতে ব্যবহৃত হয় ।

    Model.update_attribute(:column_name, column_value1)
  • update_attributesএকাধিক বৈশিষ্ট্য সহ রেকর্ড আপডেট করতে ব্যবহৃত হয় ।

    Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...)

এই দুটি পদ্ধতি তাদের অনুরূপ নাম এবং কাজগুলি দেখে বিভ্রান্ত করা সত্যিই সহজ। সুতরাং, update_attributeপক্ষে সরানো হচ্ছেupdate_column

এখন, রেলস 4 এ আপনি Model.update_column(:column_name, column_value)এর জায়গায় ব্যবহার করতে পারেনModel.update_attribute(:column_name, column_value)

সম্পর্কে আরও তথ্য পেতে এখানে ক্লিক করুনupdate_column


4

আপনার প্রশ্নের উত্তর দেওয়ার update_attributeজন্য, "বৈধতাগুলি" সংরক্ষণ করার আগে এড়িয়ে যায় তবে এটি এখনও অন্য কোনও কলব্যাকগুলি চালায়after_save ইত্যাদি So তাই আপনি যদি সত্যিই "কেবল কলামটি আপডেট করতে চান এবং কোনও এআর ক্রাফট এড়িয়ে যেতে" চান তবে আপনাকে ব্যবহার করতে হবে (স্পষ্টতই)

Model.update_all(...)দেখতে https://stackoverflow.com/a/7243777/32453


2

সাম্প্রতিককালে আমি update_attributeবনাম update_attributesএবং বৈধতা সংক্রান্ত ইস্যুতে চলে এসেছি , এত মিল, একই রকম আচরণ, এত বিভ্রান্তিকর।

হ্যাশ পাস করার জন্য update_attributeএবং বৈধতা বাইপাস করার জন্য আপনি যা করতে পারেন:

object = Object.new
object.attributes = {
  field1: 'value',
  field2: 'value2',
  field3: 'value3'
}
object.save!(validate: false)

1

আমি মনে করি আপনার প্রশ্নটি যদি পূর্বের_সভে একটি আপডেট_ট্রিবিউট থাকার কারণে এবং অন্তহীন লুপের দিকে যায় (আপডেট_ট্রিবিউট কলগুলির পূর্ববর্তী_সেভ কলব্যাকগুলিতে, মূলত একটি আপডেট_ট্রিবিউট কল দ্বারা ট্রিগার করা)

আমি নিশ্চিত যে এটি পূর্ববর্তী সংরক্ষণ কলব্যাকটিকে বাইপাস করে নি, কারণ এটি আসলে রেকর্ডটি সংরক্ষণ করে না। আপনি ব্যবহার করে বৈধতা ট্রিগার না করে একটি রেকর্ডও সংরক্ষণ করতে পারেন

Model.save মিথ্যা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.