রেল 3 এ বনাম বনাম নতুন


125

3 পাগল সালে ডক্স , buildসমিতির জন্য পদ্ধতি হিসাবে একই হিসেবে বর্ণনা করা newপদ্ধতি, কিন্তু বিদেশ কী স্বয়ংক্রিয় নিয়োগ করেন। ডক্স থেকে সরাসরি:

Firm#clients.build (similar to Client.new("firm_id" => id))

আমি অন্য কোথাও একই রকম পড়েছি।

যাইহোক, যখন আমি ব্যবহার new(যেমন some_firm.clients.newকোন পরামিতি ছাড়া), নতুন ক্লায়েন্টের firm_idসমিতি হয় স্বয়ংক্রিয়ভাবে তৈরি। আমি এখনই কনসোলটিতে ফলাফলগুলি দেখছি!

আমি কিছু অনুপস্থিত করছি? দস্তাবেজগুলি কি কিছুটা পুরানো (অসম্ভব)? মধ্যে পার্থক্য কি buildএবং new?


3
লোকেরা একটি দ্রুত উত্তর খুঁজছেন, দ্বিতীয়টি নীচে দেখুন: "বিল্ড" "" নতুন "
আইভানরিজ

উত্তর:


208

আপনি ডক্সটি কিছুটা ভুলভাবে পড়ছেন। ক্লায়েন্ট সংগ্রহ থেকে some_firm.client.newএকটি নতুন Clientঅবজেক্ট তৈরি করছে , এবং এটি স্বয়ংক্রিয়ভাবে এতে সেট করতে firm_idপারে some_firm.id, অন্যদিকে ডক্স কল করছে Client.newযা কোনও ফার্মের আইডির কোনও জ্ঞান নেই, তাই এটি এটি firm_idপাস করার প্রয়োজন।

শুধুমাত্র মধ্যে পার্থক্য some_firm.clients.newএবং some_firm.clients.buildযে মনে করা হয় buildএছাড়াও নতুন তৈরি ক্লায়েন্ট যোগ clientsসংগ্রহ:

henrym:~/testapp$ rails c
Loading development environment (Rails 3.0.4)
r:001 > (some_firm = Firm.new).save # Create and save a new Firm
#=> true 
r:002 > some_firm.clients           # No clients yet
#=> [] 
r:003 > some_firm.clients.new       # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:004 > some_firm.clients           # Still no clients
#=> [] 
r:005 > some_firm.clients.build     # Create a new client with build
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:006 > some_firm.clients           # New client is added to clients 
#=> [#<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>] 
r:007 > some_firm.save
#=> true 
r:008 > some_firm.clients           # Saving firm also saves the attached client
#=> [#<Client id: 1, firm_id: 1, created_at: "2011-02-11 00:18:47",
updated_at: "2011-02-11 00:18:47">] 

আপনি যদি কোনও অ্যাসোসিয়েশনের মাধ্যমে কোনও অবজেক্ট তৈরি করে থাকেন buildতবে এটির চেয়ে বেশি পছন্দ করা উচিত newকারণ বিল্ডটি আপনার ইন-মেমোরি অবজেক্টকে রাখে some_firm(এই ক্ষেত্রে) কোনও বিষয়বস্তুতে ডাটাবেসে সংরক্ষণ করার আগেও সামঞ্জস্যপূর্ণ অবস্থায় in


8
ব্যবহারটি some_firm.client.newক্লায়েন্টকে এতে যুক্ত করে some_firm.clientsএবং কল saveকরার some_firmফলে একটি বৈধতা ত্রুটি যা clientঅবৈধ তা নির্দেশ করে was উভয় তাহলে newএবং buildনতুন ক্লায়েন্ট যোগ some_firm'র ক্লায়েন্ট সংগ্রহ, কী buildযে কি newকরে না? আমি এখানে ঘন হওয়ার জন্য দুঃখিত!
ক্লোজারকোবয়

1
+1 আমি আপনার ফলাফল 3.0.4 দিয়ে পেয়েছি। আমি পছন্দ করি যদি 3.0.3 এর সাথে কেউ নিশ্চিত হন যে আমি পাগল নই।
ক্লোজারকোবয়

41
@ হেনরিম এটি 3.2.6 ক্লায়েন্টের মতো দেখাচ্ছে looks নতুন এবং ক্লায়েন্টস.বিল্ড দুটি মিলের মধ্যে একইরকম object আমার মতো
গুগলিংয়ের

11
দেখে মনে হচ্ছে R.২.৩ এর মধ্যে তাদের মধ্যে কোনও পার্থক্য নেই
আদিত্য কাপুর ২

4
এই উত্তরটি রিয়েল> ৩.২.১৩-এর ক্ষেত্রে সঠিক নয়, যেখানে 'বিল্ড' কেবল 'নতুন'র জন্য একটি উপাধি। নীচে @ হাতেমাহমুদের উত্তর দেখুন।
Andreas

91

buildএটির জন্য কেবল একটি উপনাম new:

alias build new

সম্পূর্ণ কোডটি পাওয়া যাবে: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74


13
alias build newরেল হিসাবে 3.2.13
ফন্টনো

7
এটি কেবল কয়েকটি সমিতি / সম্পর্কের ক্ষেত্রেই সত্য। উদাহরণস্বরূপ, একক অ্যাসোসিয়েশনের buildএবং এর জন্য সম্পূর্ণ আলাদা সংজ্ঞা রয়েছে build_#{association}। দেখুন এখানে এবং এখানে
কোরআরওয়্যার

1
এটি কি এখনও সত্য Rails 4?
ফ্যাটম্যান 13

1
এখানে বাগ রিপোর্টটি রয়েছে ... যা প্রস্তাব করে যে আপনি যদি রেস্তোঁরাজাত কাস্টোমার্স.নিউয়ের মতো নতুন কোনও গ্রাহককে রেস্তোঁরাযুক্ত কাস্টমারের সাথে সংযুক্ত না করে রেস্তোঁরা সম্পর্কিত কোনও উপায় হিসাবে ব্যবহার করেন, স্কোপড ব্যবহার করার জন্য ... .customers.scoped.new
ব্যবহারকারী 3334690

11

আপনি সঠিক, বিল্ড এবং নতুন ফাংশনগুলির বিদেশী কী সেট করার ক্ষেত্রে একই প্রভাব রয়েছে, যখন তাদের কোনও সমিতির মাধ্যমে ডাকা হয়। আমি বিশ্বাস করি যে ডকুমেন্টেশনটি এই জাতীয় লিখিত হওয়ার কারণে এটি স্পষ্ট করে বলা যায় যে একটি নতুন সক্রিয় রেকর্ড সম্পর্কের বিপরীতে একটি নতুন ক্লায়েন্ট অবজেক্ট ইনস্ট্যান্ট করা হচ্ছে। এটি একই প্রভাব যা একটি ক্লাসে নতুন কল করা রুবিতে হবে। এর অর্থ এই যে ডকুমেন্টেশনটি স্পষ্ট করে দিচ্ছে যে কোনও সংস্থার উপর কলিং বিল্ড একই, একটি নতুন অবজেক্ট তৈরি করা (নতুন কল করা) এবং সেই বস্তুর জন্য বিদেশী কীগুলি পাস করা। এই আদেশগুলি সমস্ত সমতুল্য:

Firm.first.clients.build
Firm.first.clients.new
Client.new(:firm_id => Firm.first.id)

আমি বিশ্বাস করি যে বিল্ডটি বিদ্যমান থাকার কারণটি হ'ল ফার্ম.ফায়ার্স.সি্লায়েন্টস.নেই আপনাকে বোঝানো যেতে পারে যে আপনি প্রকৃত ক্লায়েন্টের পরিবর্তে একটি নতুন has_many সম্পর্ক অবজেক্ট তৈরি করছেন, সুতরাং বিল্ডিং কল করা এটি স্পষ্ট করার একটি উপায়।


তাই তারা হয় সমতুল্য। এটি অবশ্যই মনে হচ্ছে। ধন্যবাদ!
ক্লোজারকাউয়

5
এটি সঠিক নয়। প্রথম দুটি রেলের পরবর্তী সংস্করণগুলির সমতুল্য (পোস্ট করার সময় দেখে মনে হচ্ছে এটি ছিল না)। কিন্তু, শেষটির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যে ফার্ম.ফার্স্ট.লিয়ায় নতুন ক্লায়েন্ট থাকবে না।
tybro0103

4

buildবনাম new:

বেশিরভাগই নতুন এবং বিল্ড একই হয় তবে মেমোরিতে স্টোর অবজেক্টগুলি তৈরি করে ,

উদাহরণ:

নতুন জন্য:

Client.new(:firm_id=>Firm.first.id)

নির্মাণের জন্য:

Firm.first.clients.build

এখানে ক্লায়েন্টগুলি মেমরিতে সংরক্ষণ করা হয়, যখন ফার্মটি সংরক্ষণ করুন, তখন সম্পর্কিত রেকর্ডগুলিও সংরক্ষণ করা হবে।


2

Model.new

Tag.new post_id: 1এটির post_idসেট সহ একটি ট্যাগ ইনস্ট্যান্ট করবে ।

@ model.models.new

@post.tags.buildএকই কাজ করে এবং ইনস্ট্যান্টেটেড ট্যাগটি @post.tagsসংরক্ষণ করার আগেই এতে থাকবে।

এর অর্থ @post.save@ পোষ্ট এবং নতুন নির্মিত ট্যাগ উভয়ই সাশ্রয় করবে (ধরে নিচ্ছেন: বিপরীত_সীমা সেট করা আছে)। এটি দুর্দান্ত কারণ রেলগুলি সংরক্ষণের আগে উভয় বস্তুকে বৈধতা দেবে এবং তাদের মধ্যে একটিরও যদি বৈধতা ব্যর্থ হয় তবে সংরক্ষণ করা হবে না।

মডেল.নিউ বনাম মডেল। বিল্ড

@post.tags.buildএবং @post.tags.newসমতুল্য (কমপক্ষে রেল ৩.২ থেকে)


এ কেমন The only difference between some_firm.clients.new and some_firm.clients.build seems to be that build also adds the newly-created client to the clients collection:?
レ ッ ク ス
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.