Rails/Model(Active Record)のConcern


Ruby on RailsでModelの共通処理を切り出すときに使われるConcernの紹介です。

🚌 Concernの書き方

  • includeブロックでscope, Callbackなどを定義
  • module ClassMethodsのブロックにクラス・メソッドを定義
  • インスタンスメソッドはモジュール直下
module MyConcern
extend ActiveSupport::Concern

# Scope や Callback 処理を実装する
included do
scope :without_deleted, lambda{ where(deleted_at: nil) }
end

module ClassMethods
def foo
puts 'foo'
end
end

def bar
puts 'bar'
end
end

🎃 Example

ElasticSearch の処理をconcernで分離

module Article::Searchable
extend ActiveSupport::Concern

included do
include Elasticsearch::Model

# Customize the index name
index_name "green_application"

# Set up index configuration and mapping
settings index: {
number_of_shards: 1,
number_of_replicas: 0,
analysis: {
analyzer: {
kuromoji_analyzer: {
type: 'custom',
tokenizer: 'kuromoji_tokenizer',
filter: ['kuromoji_baseform', 'pos_filter', 'greek_lowercase_filter', 'cjk_width'],
},
ngram_analyzer: {
tokenizer: "ngram_tokenizer"
}
}
}
} do
mapping _source: { enabled: true },
_all: { enabled: true, analyzer: "kuromoji_analyzer" } do
indexes :id, type: 'integer', index: 'not_analyzed'
indexes :title, type: 'string', analyzer: 'kuromoji_analyzer'
# ...
end
end

def as_indexed_json(options={})
hash = self.as_json(
include: {
job_types: { only: [:job_type_id] },
# ...
}
)
hash['client_name'] = client.name

hash
end
end

module ClassMethods
def create_index!(options={})
client = __elasticsearch__.client
client.indices.delete index: "green_application" rescue nil if options[:force]
client.indices.create index: "green_application",
body: {
settings: settings.to_hash,
mappings: mappings.to_hash
}
end
end
end

🍄 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍