すべてのモデルに 4 つの共通関数があります。
#Returns TRUE or FALSE depending on whether the column could be null or not
def self.null?(column)
columns_hash[column].null
end
#Custom delete function to change a state (deleted is a field)
def custom_delete
deleted = true
save
end
def str_created_at(format = "%d/%m/%Y %I:%M %p")
return created_at.in_time_zone.strftime(format)
end
def str_updated_at(format = "%d/%m/%Y %I:%M %p")
return updated_at.in_time_zone.strftime(format)
end
これらの 4 つの関数 (そのうちの 1 つは抽象的です: null?) を単一のモジュールに移動しようとしましたが、うまくいきませんでした:
#config/application.rb
config.autoload_paths += Dir["#{config.root}/lib/**/"]
#app/models/post.rb
class Post < ActiveRecord::Base
include BaseModel
default_scope where(:deleted => false)
end
#lib/base_model.rb
module BaseModel
def self.included(base)
base.extend ClassMethods
end
module InstanceMethods
def custom_delete
deleted = true
save
end
def str_created_at(format = "%d/%m/%Y %I:%M %p")
return created_at.in_time_zone.strftime(format)
end
def str_updated_at(format = "%d/%m/%Y %I:%M %p")
return updated_at.in_time_zone.strftime(format)
end
end
module ClassMethods
include BaseModel::InstanceMethods
def self.null?(column)
columns_hash[column].null
end
end
end
Rails コンソールで:
> Post.null?("title")
> NoMethodError: undefined method 'null?' for #<Class:0x3f075c0>
> post = Post.first
> post.str_created_at
> NoMethodError: undefined method 'str_created_at' for #<Post:0x2975190>
これらの機能を正常に動作させる方法はありますか? 私はこのコードをStackoverflowで見つけましたが、少なくともRails3では機能していないようです
これらの関数を 1 行だけで追加できるようにしたいと思います: include BaseModel
そのため、他のモデルにも追加できます。