সক্রিয় রেকর্ড ব্যবহার করার সময় ডাটাবেসের জন্য সংজ্ঞায়িত সমস্ত সারণীর তালিকা কীভাবে রাখা যায়?


126

সক্রিয় রেকর্ড ব্যবহার করার সময় আমি কীভাবে ডাটাবেসের জন্য সংজ্ঞায়িত সমস্ত সারণীর একটি তালিকা পেতে পারি?

উত্তর:


259

কল করুন ActiveRecord::ConnectionAdapters::SchemaStatements#tables। এই পদ্ধতিটি মাইএসকিউএল অ্যাডাপ্টারে নথিভুক্ত, তবে পোস্টগ্রাইএসকিউএল অ্যাডাপ্টারে নথিবদ্ধ হয়। SQLite / SQLite3 এও পদ্ধতিটি বাস্তবায়িত হয়েছে, তবে নথিভুক্ত।

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]

দেখুন activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, পাশাপাশি বাস্তবায়নগুলি এখানে:


2
তালিকায় টেবিলও রয়েছে schema_migrations। শুধু সচেতন হতে হবে। ধন্যবাদ :)
imechemi

অ্যাক্টিভেকর্ড :: বেস.কনেকশনটি হ্রাস করা যেতে পারে? apidock.com/rails/AtivetiveRecord/Base/connection আমি সেখানে অ্যাক্টিভেকর্ড :: বেসকন্টন.ট্যাবলগুলি দেখতে পাচ্ছি না।
বার্লোপ

20

পূর্ববর্তী দুটি উত্তরের উপর ভিত্তি করে, আপনি এটি করতে পারেন:

ActiveRecord::Base.connection.tables.each do |table|
  next if table.match(/\Aschema_migrations\Z/)
  klass = table.singularize.camelize.constantize      
  puts "#{klass.name} has #{klass.count} records"
end

রেকর্ডের সংখ্যার সাথে প্রতিটি মডেলকে টেবিল বিমূর্ত করে তালিকাবদ্ধ করতে।


1
একক-লাইন ধর্মান্ধদের জন্য (রেগেক্স টেবিলের ম্যাচের অতিরিক্ত সুরক্ষা ব্যতীত): (অ্যাক্টিভেকর্ড :: বেস.connection.tables - ['স্কিমা_মিগ্রেশন']) map মানচিত্র {| টি | "# {t.classify এর # {t.classify.constantize.count} রেকর্ড রয়েছে"}
সাসা কাস্তেল

1
আপনি এখানে কেন একটি রেইজেক্স ব্যবহার করেন? "পরবর্তী যদি টেবিল == 'স্কিমা_মিজারেশন'" ঠিক তেমন কাজ করে না?
tbreier

12

রেল 5.2 এর জন্য একটি আপডেট

রেল 5.2 এর জন্য আপনি নিজের টেবিলের নামগুলিও ApplicationRecordপেতে ব্যবহার করতে পারেন Array। ঠিক যেমন, ইমেছেমি উল্লেখ করেছেন, সচেতন হন যে এই পদ্ধতিটিও ফিরে আসবে ar_internal_metadataএবং schema_migrationsসেই অ্যারেতে।

ApplicationRecord.connection.tables

1

দেখে মনে হয় এর চেয়ে ভাল উপায় হওয়া উচিত তবে আমি কীভাবে আমার সমস্যার সমাধান করেছি তা এখানে:

Dir["app/models/*.rb"].each do |file_path|
  require file_path # Make sure that the model has been loaded.

  basename  = File.basename(file_path, File.extname(file_path))
  clazz     = basename.camelize.constantize

  clazz.find(:all).each do |rec|
    # Important code here...
  end
end

এই কোডটি ধরে নেওয়া হয়েছে যে আপনি ক্লাস এবং উত্স কোড ফাইলগুলির জন্য আদর্শ মডেল নামকরণের কনভেনশনগুলি অনুসরণ করছেন।


2
এটি আপনার অ্যাপ্লিকেশন / মডেলগুলির সমস্ত কিছুই ধরে নিয়েছে / এটি একটি সক্রিয় রেকর্ড মডেল
লোকালহস্তডটদেব

0

সক্রিয় রেকর্ড সম্পর্কে জানেন না, তবে এখানে একটি সহজ প্রশ্ন রয়েছে:

INFORMATION_SCHEMA থেকে টেবিলের নামটি নির্বাচন করুন T টেবিলগুলি যেখানে TABLE_TYPE = 'বেস টেবিল'

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