একাধিক অ্যাট্রিবিউট দ্বারা রেল সন্ধান_আর_স্রষ্টা_?


202

সক্রিয় রেকর্ডে একটি কার্যকর ডায়নামিক বৈশিষ্ট্য রয়েছে যা find_or_create_by নামে পরিচিত:

Model.find_or_create_by_<attribute>(:<attribute> => "")

তবে যদি আমার একাধিক বৈশিষ্ট্যের দ্বারা সন্ধানের_র_র দরকার হয়?

বলুন গ্রুপ এবং মেম্বার নামে পরিচিত গ্রুপ এবং সদস্যের মধ্যে এম: এম সম্পর্ক পরিচালনা করার জন্য আমার একটি মডেল রয়েছে। আমার অনেকগুলি উদাহরণ থাকতে পারে যেখানে সদস্য_আইডি = 4, তবে আমি কখনোই এর চেয়ে বেশি উদাহরণ চাই না যেখানে সদস্যের_আইডি = 4 এবং গ্রুপ_আইডি = 7 আমি এরকম কিছু করা সম্ভব কিনা তা খুঁজে বের করার চেষ্টা করছি:

GroupMember.find_or_create(:member_id => 4, :group_id => 7)

আমি বুঝতে পারি এটি পরিচালনা করার আরও ভাল উপায় থাকতে পারে তবে আমি ফাইন্ড_অর_ক্রিয়েট ধারণার সুবিধার্থে পছন্দ করি।

উত্তর:


464

একের সাথে একাধিক বৈশিষ্ট্য সংযুক্ত করা যেতে পারে and:

GroupMember.find_or_create_by_member_id_and_group_id(4, 7)

( find_or_initialize_byআপনি যদি এখনই রেকর্ডটি সংরক্ষণ করতে না চান তবে ব্যবহার করুন )

সম্পাদনা করুন: উপরের পদ্ধতিটি 4 টি রেলগুলিতে অবচয় করা হয়েছে এটি করার নতুন উপায়টি হ'ল:

GroupMember.where(:member_id => 4, :group_id => 7).first_or_create

এবং

GroupMember.where(:member_id => 4, :group_id => 7).first_or_initialize

2 সম্পাদনা করুন: এগুলি সমস্তই কেবল রেলের বাইরে নির্দিষ্ট বৈশিষ্ট্যযুক্ত নয়।

https://github.com/rails/rails/blob/4-2-stable/guides/source/active_record_querying.md

উদাহরণ

GroupMember.find_or_create_by_member_id_and_group_id(4, 7)

হয়ে ওঠে

GroupMember.find_or_create_by(member_id: 4, group_id: 7)

আপনি github.com/seamusabshere/upsert পছন্দও করতে পারেন - প্রথম যুক্তিটি এমন একটি বৈশিষ্ট্যের একটি হ্যাশ যা রেকর্ড খুঁজতে বা তৈরি করতে ব্যবহৃত হয়
Seamus Abshere

1
এটি লক্ষণীয় যে সহায়কটিকে নতুন () এর পরিবর্তে তৈরি () কে কল্পনা করতে হবে যা first_or_create ক্ষেত্রে বলা যেতে পারে
সুমিত

কেউ কেউ এই ব্যবহারের একটি সংক্ষিপ্ত উদাহরণ ভাগ করতে পারেন? আমি এর স্থাপনা এবং কলিংয়ের সাথে পরিচিত নই।
ড্যান

প্রচুর লোক এখনও 4 টি রেল ব্যবহার করছে না, তাই আমি রেইল 3 কোডটি অপসারণকে ফিরিয়ে দিয়েছি।
কাইল হিরোনিমাস

কেবল যুক্ত করার জন্য: সন্ধান_অর_ক্রিয়েট_বাই _ * () ফাংশনগুলি 4 রেলগুলিতে অবচিত করা হয়েছে, তবে ফাইন্ড_অর_ক্রিয়েট_বি () নেই। Find_or_create_by () ব্যবহার করা ঠিক আছে। এটিতে github.com/rails/rails/commit/… এবং অফিসিয়াল রেয়েলগুলি 4.2 নথিপত্র যুক্ত করা হয়েছে বলে প্রতিশ্রুতিটি পরীক্ষা করুন : গাইডস.আরবায়ারালইলস.আরভিভি 4.2.0/…
কোডএক্সপ্রেস

33

অন্য যে কেউ এই থ্রেড জুড়ে হোঁচট খায় তবে পরিস্থিতি অনুসারে পরিবর্তিত হতে পারে এমন বৈশিষ্ট্যযুক্ত কোনও বিষয় সন্ধান করতে বা তৈরি করতে হবে, আপনার মডেলটিতে নিম্নলিখিত পদ্ধতিটি যুক্ত করুন:

# Return the first object which matches the attributes hash
# - or -
# Create new object with the given attributes
#
def self.find_or_create(attributes)
  Model.where(attributes).first || Model.create(attributes)
end

অপ্টিমাইজেশন টিপ: আপনি যে সমাধানটি বেছে নিন তা বিবেচনা না করেই আপনি যে বৈশিষ্ট্যগুলি প্রায়শই জিজ্ঞাসা করছেন তার জন্য সূচকগুলি যুক্ত বিবেচনা করুন।


8
একটি বিষয় লক্ষণীয় তা হ'ল এটি এমন বৈশিষ্ট্যগুলি পরিচালনা করবে না যা যখন ভর-বরাদ্দ করা যায় না, যখন find_or_create_byহবে।
x1a4

1
মার্কো, চেষ্টা করুন Model.where(attributes).instance_eval{|q| q.first || q.create}
হিরোশি

3
find_or_createএছাড়াও একটি লেনদেন ব্যবহার করার সুবিধা রয়েছে, যেখানে where….first || createএকটি রেসের শর্ত পরিচয় করিয়ে দেয়
এমআরএম

আমি তাই বলব def self.find_or_create(attributes) self.where(attributes).first || self.create(attributes) endযাতে আপনার পুনরাবৃত্তি করতে হবে নাModel
অগাস্টিন রিডিংগার

@ অগাস্টিনরিডঞ্জার আপনার প্রয়োজন selfহয় না পদ্ধতি পদ্ধতির অভ্যন্তরে (যেহেতু আপনি শব্দগুলি সরাতে চাইছেন!)।
ডেভিড টুয়েট

31

4 কারাগারে আপনি এটি করতে পারেন:

GroupMember.find_or_create_by(member_id: 4, group_id: 7)

এবং ব্যবহার whereআলাদা:

GroupMember.where(member_id: 4, group_id: 7).first_or_create

এই ডাকব createউপর GroupMember.where(member_id: 4, group_id: 7):

GroupMember.where(member_id: 4, group_id: 7).create

বিপরীতভাবে, find_or_create_by(member_id: 4, group_id: 7)ডাকব createউপর GroupMember:

GroupMember.create(member_id: 4, group_id: 7)

দয়া করে রেল / রেল সম্পর্কিত এই সম্পর্কিত প্রতিশ্রুতি দেখুন ।


16

এতে একটি ব্লক find_or_createপাস করার মাধ্যমে আপনি অতিরিক্ত পরামিতিগুলি পাস করতে পারেন যা নতুন তৈরি করা হলে এটিতে যুক্ত করা হবে। আপনি যদি সন্ধান করছেন না এমন কোনও ক্ষেত্রের উপস্থিতি যাচাই করছেন তবে এটি কার্যকর।

ধরে নেওয়া যাক:

class GroupMember < ActiveRecord::Base
    validates_presence_of :name
end

তারপর

GroupMember.where(:member_id => 4, :group_id => 7).first_or_create { |gm| gm.name = "John Doe" }

"জন দো" নামে একটি নতুন গ্রুপমেম্বার তৈরি করবে যদি এটির সাথে এটির সন্ধান না পায় member_id 4 and group_id 7


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