রেলগুলি আপডেট না করে_ট্রিবিউটস সংরক্ষণ না করে?


385

আপডেট_অ্যাট্রিবিউটের বিকল্প নেই যা রেকর্ডটি সংরক্ষণ করে না?

সুতরাং আমি যেমন কিছু করতে পারে:

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

বিটিডাব্লু, আমি জানি আমি পারব @car.model = 'Sierra', তবে আমি সেগুলিকে এক লাইনে আপডেট করতে চাই।


"রেকর্ডটি সংরক্ষণ না করা" বলতে কী বোঝ?
আনাতলি

update_attributes মডেলটি ডিবি সংরক্ষণ করে। আমি ভাবছি যে এরকম একটি পদ্ধতি আছে কিনা।
tybro0103

3
অ-ধ্বংসাত্মক পদ্ধতির বৈশিষ্ট্যগুলি । বিশদগুলির জন্য API দেখুন
আনাতোলি

3
আপনি আপডেট_ক্লোনম (নাম, মান) ব্যবহার করতে পারেন সেভ কল না করে কোনও অবজেক্টের একক বৈশিষ্ট্য আপডেট করে। 1. বৈধতা বাদ দেওয়া হয়। 2. কলব্যাকগুলি এড়িয়ে যায়। ৩. আপডেট_এট / আপডেটড_ন কলামটি যদি কলামটি উপলব্ধ থাকে তবে আপডেট হয় না। apidock.com/rails/AtivetiveRecord/Persistance/update_column
এন্টোইন

উত্তর:


596

আমি বিশ্বাস করি আপনি যা খুঁজছেন তা হ'ল assign_attributes

এটি মূলত আপডেট_অ্যাট্রিবিউটের মতো তবে এটি রেকর্ডটি সংরক্ষণ করে না:

class User < ActiveRecord::Base
  attr_accessible :name
  attr_accessible :name, :is_admin, :as => :admin
end

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
user.assign_attributes({ :name => 'Bob'})
user.name        # => "Bob"
user.is_admin?   # => false
user.new_record? # => true

মডেলটি থেকে আপনি এই লাইনটি আটকাননি বলে আপনার উদাহরণটি কিছুটা বিভ্রান্তিকর:; attr_accessible :is_admin, :as => :admin)
রবিন

@Robin অথবা কেবল: attr_protected :is_admin। বা: attr_accessible :nameপয়েন্টটি এই উদাহরণে: is_admin সুরক্ষিত। আমার এটিও লক্ষ্য করা উচিত যে একটি সুরক্ষিত বৈশিষ্ট্যকে ভর করার চেষ্টা করা .assign_attributesসত্যই একটি উত্থাপন করে না ActiveModel::MassAssignmentSecurity::Error, যদিও এটি উদাহরণে প্রদর্শিত হয়নি।
আজেদী 32

হ্যাঁ তবে আমার লাইনটি আপনি যে দস্তাবেজে লিঙ্ক করেছেন তার থেকে। আমি কেবল বলছি আপনার পুরো উদাহরণটি অনুলিপি / আটকানো উচিত ছিল। তবে হ্যাঁ, আপনি কেবল এটির সুরক্ষিত বলতে পারেন।
রবিন

@ রবিন আমি আরও কিছু নির্দিষ্ট হওয়ার জন্য উদাহরণটি আপডেট করব। দস্তাবেজের উদাহরণটিও কিছুটা বিভ্রান্তিকর, কারণ এটি উল্লেখ করে না যে user.assign_attributes({ :name => 'Josh', :is_admin => true })কোনও ত্রুটি বার্তা উত্থাপন করে এবং ব্যবহারকারীর নাম সম্পত্তি সেট করে না।
আজেদী 32

7
Assail_attributes ails.১ এর পরে রেলগুলি থেকে উপলভ্য, সুতরাং আপনি যদি এখনও রিলগুলির একটি পুরানো সংস্করণ চালাচ্ছেন তবে আপনি এটি ব্যবহার করতে পারবেন না।
হাইগিন

173

আপনি ব্যবহার করতে পারেন assign_attributesবাattributes= (সেগুলি একই)

হালনাগাদের পদ্ধতিগুলি শীটকে প্রতারণা করে (6 টি ছামার জন্য):

  • update= assign_attributes+save
  • attributes= = ওরফে assign_attributes
  • update_attributes = অবমানিত, উপন্যাসের update

সূত্র:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistance.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment .rb

আর একটি ঠকানো শীট: http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat- পত্রক


1
পরিষ্কার এবং সংক্ষিপ্ত। ধন্যবাদ।
ফ্রিম্যানয়েড

1
.attributes = val এর ক্ষেত্রে, যদি আপনার মডেলটি একটি হয়ে থাকে এবং অন্য কোনও মডেলের জন্য_সেটেড_নেট_ট্রিবিউটস_কে স্বীকার করে, সেই_মডেল_ট্রিবিউটস (আইডি ব্যতীত) পাস করা বিদ্যমান has_one মডেলটিকে মুছে ফেলবে, এমনকি আপনি যদি অবিচল থাকেন না (যেমন সংরক্ষণ করুন)। কিন্তু Assign_attributes এর মতো আচরণ করে না।
ক্লাসিপিম্প

65

আপনি 'গুণাবলী' পদ্ধতিটি ব্যবহার করতে পারেন:

@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}

সূত্র: http://api.rubyonrails.org/class/ActiveRecord/Base.html

অ্যাট্রিবিউটস = (নতুন_অ্যাট্রিবিউটস, গার্ড_প্রোটেক্টেড_ট্রিবিউটস = সত্য) আপনাকে অ্যাট্রিবিউট নামের সাথে কীগুলি (যা আবার কলামের নামের সাথে মেলে) এর সাথে একটি হ্যাশ দিয়ে পাস করে সমস্ত বৈশিষ্ট্য একবারে সেট করার অনুমতি দেয়।

যদি প্রহরী_রক্ষিত_অযুক্তিগুলি সত্য (ডিফল্ট) হয় তবে সংবেদনশীল বৈশিষ্ট্যগুলি অ্যাটর_প্রোটেক্টেড ম্যাক্রো ব্যবহার করে এই ভর-কার্যভার থেকে এই সুরক্ষা থেকে রক্ষা করা যেতে পারে। অথবা আপনি বিকল্পভাবে নির্দিষ্ট করতে পারেন যে অ্যাট্রি_ অ্যাক্সেসযোগ্য ম্যাক্রোর সাথে কোন বৈশিষ্ট্য অ্যাক্সেস করা যায়। তারপরে এতে অন্তর্ভুক্ত না সমস্ত বৈশিষ্ট্যকে ভর-নির্ধারিত হতে দেওয়া হবে না।

class User < ActiveRecord::Base
  attr_protected :is_admin
end

user = User.new
user.attributes = { :username => 'Phusion', :is_admin => true }
user.username   # => "Phusion"
user.is_admin?  # => false

user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
user.is_admin?  # => true

7

কোনও অ্যাক্টিভেকর্ড মডেলটিতে সঞ্চয় না করে মানের ভর করার জন্য, হয় assign_attributesবা attributes=পদ্ধতিগুলি ব্যবহার করুন। এই পদ্ধতিগুলি 3 টি নতুন এবং আরও নতুন উপলব্ধ। তবে সচেতন হওয়ার জন্য সামান্য পার্থক্য এবং সংস্করণ-সম্পর্কিত গোট্যাচ রয়েছে।

উভয় পদ্ধতিই এই ব্যবহারটি অনুসরণ করে:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }

@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }

নোট করুন যে কোনও পদ্ধতিই বৈধতা সম্পাদন করবে না বা কলব্যাকগুলি কার্যকর করবে না; কলব্যাক এবং বৈধতা কখন ঘটবেsave বলা ।

রেল 3

attributes=R. কারাগারের তুলনায় কিছুটা আলাদা assign_attributes3 attributes=. assign_attributesএ জাতীয় কোনও হ্যাশ চেক নেই। এর জন্য অ্যাক্টিভেকর্ড অ্যাট্রিবিউট অ্যাসাইনমেন্ট এপিআই ডকুমেন্টেশনattributes= দেখুন ।

নিম্নলিখিত অবৈধ কোডটি অ্যাট্রিবিউট সেট না করে কেবল ফিরে এসে চুপচাপ ব্যর্থ হবে:

@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]

attributes= নিঃশব্দে এমন আচরণ করবে যেন অ্যাসাইনমেন্টগুলি সফলভাবে করা হয়েছিল, যখন সত্যই ছিল না।

assign_attributesঘেরযুক্ত অ্যারের হ্যাশ কীগুলিকে আরও শক্তিশালী করার চেষ্টা করার সময় এই অবৈধ কোডটি একটি ব্যতিক্রম বাড়িয়ে তুলবে:

@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])

assign_attributesএর NoMethodErrorজন্য ব্যতিক্রম উত্থাপন করবে stringify_keys, ইঙ্গিত করে যে প্রথম যুক্তি হ্যাশ নয়। ব্যতিক্রম নিজেই প্রকৃত কারণ সম্পর্কে খুব তথ্যপূর্ণ নয়, কিন্তু এটা সত্য যে একটি ব্যতিক্রম ঘটবে না হয় খুব গুরুত্বপূর্ণ।

এই ক্ষেত্রেগুলির মধ্যে কেবলমাত্র পার্থক্য হ'ল ভর অ্যাসাইনমেন্টের জন্য ব্যবহৃত পদ্ধতি: attributes=নিঃশব্দে সফল হয় এবং assign_attributesকোনও ত্রুটি ঘটেছে তা জানাতে একটি ব্যতিক্রম উত্থাপন করে।

এই উদাহরণগুলি সংবিধিবদ্ধ বলে মনে হতে পারে, এবং সেগুলি একটি ডিগ্রীতে রয়েছে, তবে এপিআই থেকে ডেটা রূপান্তর করার সময়, বা এমনকি কেবলমাত্র একটি সিরিজের ডেটা ট্রান্সফর্মেশন ব্যবহার করে এবং Hash[]ফাইনালের ফলাফলগুলিতে ভুলে গিয়ে এই ধরণের ত্রুটি সহজেই দেখা দিতে পারে .map। উপরে কিছু কোড 50 রেখাগুলি বজায় রাখুন এবং আপনার অ্যাট্রিবিউট অ্যাসাইনমেন্ট থেকে 3 টি ফাংশন সরানো হয়েছে এবং আপনি ব্যর্থতার একটি রেসিপি পেয়েছেন।

রেল 3 সহ পাঠটি হ'ল: সর্বদাassign_attributes পরিবর্তে ব্যবহার করুনattributes=

রেল 4

4 রেলগুলিতে, attributes=কেবলমাত্র একটি উপাধি assign_attributes। এর জন্য অ্যাক্টিভেকর্ড অ্যাট্রিবিউট অ্যাসাইনমেন্ট এপিআই ডকুমেন্টেশনattributes= দেখুন ।

রেলস 4 এর সাথে, যে কোনও পদ্ধতিই আন্তঃআযোগযোগ্যভাবে ব্যবহার করা যেতে পারে। প্রথম যুক্তি হিসাবে একটি হ্যাশ পাস করতে ব্যর্থতার ফলে খুব সহায়ক ব্যতিক্রম হবে:ArgumentError: When assigning attributes, you must pass a hash as an argument.

যাচাই

আপনি যদি ক প্রস্তুতিতে প্রাক-উড়ানের কার্যাদি করেন তবে আপনি saveসংরক্ষণের আগে বৈধতা দেওয়ার আগ্রহীও হতে পারেন। আপনি এটির জন্য valid?এবং invalid?পদ্ধতিগুলি ব্যবহার করতে পারেন । উভয়ই বুলিয়ান মান দেয়। valid?যদি সংরক্ষণ না করা মডেল সমস্ত বৈধতা পাস করে বা এটি না করে তবে সত্যটি প্রত্যাশা করে। invalid?সহজভাবে এর বিপরীতvalid?

valid? এটি ব্যবহার করা যেতে পারে:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?

এটি আপনাকে কল করার আগেই কোনও বৈধতা সংক্রান্ত সমস্যাগুলি পরিচালনা করার ক্ষমতা দেয় save

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