##はじめに
Railsアプリを作成するまでもないけど、RailsのようにActiveRecordを快適に使いたいと思った時の一案。
##全体
model_controller.rb
require "sqlite3"
require "active_record"
Dir[__dir__ + '/model/*.rb'].each(&method(:require))
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => __dir__ + '/db/sample.sqlite3'
)
def create_test_table(code)
table_name = "sample" + code.to_s + "s"
table_sym = table_name.to_sym
unless ActiveRecord::Base.connection.table_exists? table_sym
ActiveRecord::Base.connection.create_table table_sym do |t|
t.string :name
t.float :score
end
orm(table_name)
end
end
private
# tableとmodelを関連付ける
def orm(table_name)
model_name = table_name.singularize.camelcase
file = __dir__ + '/model/' + model_name + ".rb"
create_class = "class #{model_name} < ActiveRecord::Base; end"
IO.write(file, create_class)
model_path = __dir__ + "/model/" + model_name
require_relative model_path
end
##1:テーブルを作成する。
同じ構造のテーブルを何個も作りたいということを想定しています。
idカラムは自動的に作成されます。
Ruby ハッシュのキーを変数で使いたい
def create_test_table(code)
table_name = "sample" + code.to_s + "s"
table_sym = table_name.to_sym
unless ActiveRecord::Base.connection.table_exists? table_sym
ActiveRecord::Base.connection.create_table table_sym do |t|
t.string :name
t.float :score
end
orm(table_name)
end
end
##2:テーブルとモデルを関連付ける。
先頭でmodelディレクトリ下のファイルを全て読み込むように設定します。
Rubyでディレクトリ内のすべてのファイルをrequireする方法
&演算子と、procと、Object#method について理解しなおす
#Dir[File.dirname(__FILE__) + '/model/*.rb'].each {|file| require file }
Dir[__dir__ + '/model/*.rb'].each(&method(:require))
モデルディレクトリ下にActiveRecord::Baseを継承したモデルclass作成します。
テーブル情報からModelを動的生成する方法 (ActiveRecordの単体利用時)
def orm(table_name)
model_name = table_name.singularize.camelcase
file = __dir__ + '/model/' + model_name + ".rb"
create_class = "class #{model_name} < ActiveRecord::Base; end"
IO.write(file, create_class)
model_path = __dir__ + "/model/" + model_name
require_relative model_path
end
model_path = __dir__ + "/model/" + model_name
require_relative model_path
の部分で、modelディレクトリに新しく追加されたモデルクラスを読み込みます。
##使う
###基本
main.rb
require_relative 'model_controller.rb'
create_test_table(7500)
puts Sample7500.count #=> 0
Sample7500.create(name:"qiita",score:56.3)
puts Sample7500.count #=> 1
###モデルの中でメソッド定義したい。
Railsと同じように作成されたモデルファイルの中にメソッドを書き込むだけでOK。
model/Sample7500.rb
class Sample7500 < ActiveRecord::Base
def self.hello
puts "Hello from Model!"
end
end
普通に使える。
Sample7500.hello #=> "Hello from Model!"