কোনও মডেলের আইডি মান তৈরির ক্ষেত্রে ওভাররাইড করার কোনও উপায় আছে কি? কিছুটা এইরকম:
Post.create(:id => 10, :title => 'Test')
আদর্শ হতে পারে, তবে অবশ্যই কাজ করবে না।
কোনও মডেলের আইডি মান তৈরির ক্ষেত্রে ওভাররাইড করার কোনও উপায় আছে কি? কিছুটা এইরকম:
Post.create(:id => 10, :title => 'Test')
আদর্শ হতে পারে, তবে অবশ্যই কাজ করবে না।
উত্তর:
আইডিটি কেবলমাত্র অ্যাট্রি_প্রোটেক্টেড, এজন্য আপনি সেট করতে ভর-অ্যাসাইনমেন্ট ব্যবহার করতে পারবেন না। তবে ম্যানুয়ালি সেট করার সময় এটি কেবল কাজ করে:
o = SomeObject.new
o.id = 8888
o.save!
o.reload.id # => 8888
আমি আসল প্রেরণাটি কী তা নিশ্চিত নই, তবে অ্যাক্টিহ্যাশ মডেলগুলিকে অ্যাক্টিভেকর্ডে রূপান্তর করার সময় আমি এটি করি। অ্যাক্টিভ্যাশ আপনাকে অ্যাক্টিভেকর্ডে একই সম্পর্কিত_সামেন্টিকগুলি ব্যবহার করার অনুমতি দেয় তবে মাইগ্রেশন এবং একটি টেবিল তৈরি করার পরিবর্তে এবং প্রতিটি কলে ডাটাবেসের ওভারহেড ব্যয় করার পরিবর্তে আপনি কেবলমাত্র আপনার ডেটা yML ফাইলগুলিতে সঞ্চয় করেন। ডাটাবেসের বিদেশী কীগুলি yML- এ মেমরি আইডি উল্লেখ করে।
অ্যাক্টিভ্যাশ পিকলিস্ট এবং ছোট টেবিলগুলির জন্য দুর্দান্ত যা অবিচ্ছিন্নভাবে পরিবর্তিত হয় এবং কেবল বিকাশকারীদের দ্বারা পরিবর্তিত হয়। সুতরাং অ্যাক্টিভ্যাশ থেকে অ্যাক্টিভেকর্ডে যাওয়ার সময়, সমস্ত বিদেশী কী উল্লেখগুলি একই রাখাই সহজ।
ActiveRecord::VERSION::STRING == "3.2.11"
এখানে এসেছি (স্ক্লাইট 3 অ্যাডাপ্টারের সাথে) এবং উপরেরটি আমার জন্য কাজ করে।
চেষ্টা
a_post = Post.new do |p|
p.id = 10
p.title = 'Test'
p.save
end
এটি আপনি যা খুঁজছেন তা আপনাকে দেওয়া উচিত।
আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:
Post.create({:id => 10, :title => 'Test'}, :without_protection => true)
যদিও দস্তাবেজে বর্ণিত হয়েছে, এটি ভর-নিয়োগের সুরক্ষাটিকে বাইপাস করবে।
4 রেলের জন্য:
Post.create(:title => 'Test').update_column(:id, 10)
অন্যান্য পাগল 4 উত্তর হয়নি না আমার জন্য কাজ করে। রেলস কনসোলটি ব্যবহার করার সময় তাদের মধ্যে অনেকে পরিবর্তন করার জন্য উপস্থিত হয়েছিল, কিন্তু আমি যখন মাইএসকিউএল ডাটাবেসে মানগুলি পরীক্ষা করেছি তখন সেগুলি অপরিবর্তিত ছিল। অন্যান্য উত্তরগুলি কেবল কখনও কখনও কাজ করে।
অন্তত মাইএসকিউএল-র জন্য, id
অটো বর্ধিত আইডি নম্বরটির নীচে একটি অ্যাসাইন করা আপনার ব্যবহার না করা কার্যকর হয় নাupdate_column
। উদাহরণ স্বরূপ,
p = Post.create(:title => 'Test')
p.id
=> 20 # 20 was the id the auto increment gave it
p2 = Post.create(:id => 40, :title => 'Test')
p2.id
=> 40 # 40 > the next auto increment id (21) so allow it
p3 = Post.create(:id => 10, :title => 'Test')
p3.id
=> 10 # Go check your database, it may say 41.
# Assigning an id to a number below the next auto generated id will not update the db
আপনি যদি + create
ব্যবহার পরিবর্তন করেন তবে আপনার এখনও এই সমস্যাটি থাকবে। ম্যানুয়ালি এর মতো পরিবর্তন করাও এই সমস্যা তৈরি করে।new
save
id
p.id = 10
সাধারণভাবে, আমি এটি update_column
পরিবর্তন করতে ব্যবহার করব id
যদিও এটির জন্য অতিরিক্ত ডেটাবেস কোয়েরি ব্যয় হয় কারণ এটি সর্বদা কাজ করবে। এটি এমন একটি ত্রুটি যা আপনার বিকাশের পরিবেশে প্রদর্শিত নাও হতে পারে, তবে কাজ করার সময় চুপচাপ আপনার প্রোডাকশন ডেটাবেসকে নষ্ট করে দিতে পারে।
Post.new.update(id: 10, title: 'Test')
আসলে, দেখা যাচ্ছে যে নিম্নলিখিত কাজগুলি করা:
p = Post.new(:id => 10, :title => 'Test')
p.save(false)
validate: false
পরিবর্তে পাস করলে এটি এখনও কাজ করে false
। যাইহোক, আপনি এখনও সুরক্ষিত বৈশিষ্ট্য ইস্যুতে চালিত হন - এর উত্তরের একটি আলাদা উপায় আছে যা আমি আমার উত্তরে উল্লেখ করেছি।
জেফ যেমন উল্লেখ করেছেন, আইডিটি এমনভাবে আচরণ করে যেন এটি অ্যাট্রি_প্রোটেক্টেড। এটি রোধ করতে আপনার ডিফল্ট সুরক্ষিত বৈশিষ্ট্যের তালিকাটি ওভাররাইড করতে হবে। বাইরে থেকে যে কোনও অ্যাট্রিবিউট তথ্য আসতে পারে তা এই জায়গায় সাবধানে করুন। আইডি ফিল্ডটি কোনও কারণে ডিফল্ট সুরক্ষিত।
class Post < ActiveRecord::Base
private
def attributes_protected_by_default
[]
end
end
(অ্যাক্টিভেকর্ড 2.3.5 দিয়ে পরীক্ষিত)
আমরা অ্যাট্রিবিউট_রক্ষিত_বিধ্বনি_ডিফল্টকে ওভাররাইড করতে পারি
class Example < ActiveRecord::Base
def self.attributes_protected_by_default
# default is ["id", "type"]
["type"]
end
end
e = Example.new(:id => 10000)
Post.create!(:title => "Test") { |t| t.id = 10 }
এটি সাধারণত আপনি যে কাজটি করতে চান তা হিসাবে আমাকে আঘাত করে না, তবে আইডির একটি নির্দিষ্ট সেট (উদাহরণস্বরূপ যখন একটি রেক টাস্ক ব্যবহার করে ডিফল্ট তৈরি করার সময়) দিয়ে একটি টেবিল তৈরি করা দরকার তবে এটি বেশ ভালভাবে কাজ করে you অটো-ইনক্রিমেন্টিংকে ওভাররাইড করতে চান (যাতে আপনি প্রতিটি সময় টাস্কটি চালাবেন একই আইডিতে টেবিলটি জনপ্রিয় হয়):
post_types.each_with_index do |post_type|
PostType.create!(:name => post_type) { |t| t.id = i + 1 }
end
এই create_with_id ফাংশনটি আপনার বীজ.rb এর শীর্ষে রাখুন এবং তারপরে এটি স্পষ্টত আইডির পছন্দসই যেখানে আপনার অবজেক্ট তৈরি করতে ব্যবহার করুন।
def create_with_id(clazz, params)
obj = clazz.send(:new, params)
obj.id = params[:id]
obj.save!
obj
end
এবং এটি এটি ব্যবহার করুন
create_with_id( Foo, {id:1,name:"My Foo",prop:"My other property"})
পরিবর্তে ব্যবহার
Foo.create({id:1,name:"My Foo",prop:"My other property"})
এই ক্ষেত্রে একটি অনুরূপ ইস্যু যা প্রয়োজন ছিল id
এক ধরণের কাস্টম তারিখ দিয়ে ওভাররাইট :
# in app/models/calendar_block_group.rb
class CalendarBlockGroup < ActiveRecord::Base
...
before_validation :parse_id
def parse_id
self.id = self.date.strftime('%d%m%Y')
end
...
end
এবং তারপর :
CalendarBlockGroup.create!(:date => Date.today)
# => #<CalendarBlockGroup id: 27072014, date: "2014-07-27", created_at: "2014-07-27 20:41:49", updated_at: "2014-07-27 20:41:49">
কলব্যাকস ঠিকঠাক কাজ করে।
শুভকামনা !.
id
ইউনিক্স টাইম স্ট্যাম্পের উপর ভিত্তি করে তৈরি করা দরকার । আমি এটা ভিতরে করেছি before_create
। ঠিকভাবে কাজ করে.
পাগল 3 জন্য, এই কাজ করতে সহজ উপায় ব্যবহার করা new
সঙ্গে without_protection
পরিশোধন, এবং তারপর save
:
Post.new({:id => 10, :title => 'Test'}, :without_protection => true).save
বীজ ডেটার জন্য, বৈধতা যা আপনি এটি করতে পারেন তা বাইপাস করার অর্থ হতে পারে:
Post.new({:id => 10, :title => 'Test'}, :without_protection => true).save(validate: false)
আমরা আসলে অ্যাক্টিভেকর্ড :: বেসে একটি সহায়ক পদ্ধতি যুক্ত করেছি যা বীজ ফাইলগুলি কার্যকর করার আগে অবিলম্বে ঘোষণা করা হয়:
class ActiveRecord::Base
def self.seed_create(attributes)
new(attributes, without_protection: true).save(validate: false)
end
end
এবং এখন:
Post.seed_create(:id => 10, :title => 'Test')
রেলস 4 এর জন্য, আপনি সুরক্ষিত বৈশিষ্ট্যের পরিবর্তে স্ট্রংপ্যারাম ব্যবহার করা উচিত। যদি এটি হয় তবে আপনি কোনও পতাকা ছাড়াই কেবল নিয়োগ এবং সংরক্ষণ করতে সক্ষম হবেন new
:
Post.new(id: 10, title: 'Test').save # optionally pass `{validate: false}`
{}
উপরে শমূয়েলের উত্তর হিসাবে গুণাবলী না রেখে আমার পক্ষে কাজ করে না (রেল 3)।
id
এখনও 10
id
10 হিসাবে পাস হয়েছে - সুতরাং ঠিক এটি হওয়া উচিত। আপনি যদি যা আশা করেছিলেন তা যদি না হয় তবে আপনি কি উদাহরণ দিয়ে স্পষ্ট করে বলতে পারেন?