Skip to content

Commit 4a0cdb9

Browse files
fbernierkarmi
authored andcommitted
[MODEL] Added dynamic getter/setter (block/proc) for MyModel.index_name
class Article index_name { "articles-#{Time.now.year}" } end Closes elastic#159
1 parent 09125a9 commit 4a0cdb9

File tree

3 files changed

+116
-5
lines changed

3 files changed

+116
-5
lines changed

elasticsearch-model/lib/elasticsearch/model/naming.rb

+29-5
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,30 @@ module ClassMethods
1515
# index_name "articles-#{Rails.env}"
1616
# end
1717
#
18+
# @example Set the index name for the `Article` model and reevaluate it on each call
19+
#
20+
# class Article
21+
# index_name { "articles-#{Time.now.year}" }
22+
# end
23+
#
1824
# @example Directly set the index name for the `Article` model
1925
#
2026
# Article.index_name "articles-#{Rails.env}"
2127
#
22-
# TODO: Dynamic names a la Tire -- `Article.index_name { "articles-#{Time.now.year}" }`
28+
# @example Directly set the index name for the `Article` model and reevaluate it on each call
2329
#
24-
def index_name name=nil
25-
@index_name = name || @index_name || self.model_name.collection.gsub(/\//, '-')
30+
# Article.index_name { "articles-#{Time.now.year}" }
31+
#
32+
def index_name name=nil, &block
33+
if name || block_given?
34+
return (@index_name = name || block)
35+
end
36+
37+
if @index_name.respond_to?(:call)
38+
@index_name.call
39+
else
40+
@index_name || self.model_name.collection.gsub(/\//, '-')
41+
end
2642
end
2743

2844
# Set the index name
@@ -67,8 +83,16 @@ module InstanceMethods
6783
# @article.index_name "articles-#{@article.user_id}"
6884
# @article.__elasticsearch__.update_document
6985
#
70-
def index_name name=nil
71-
@index_name = name || @index_name || self.class.index_name
86+
def index_name name=nil, &block
87+
if name || block_given?
88+
return (@index_name = name || block)
89+
end
90+
91+
if @index_name.respond_to?(:call)
92+
@index_name.call
93+
else
94+
@index_name || self.class.index_name
95+
end
7296
end
7397

7498
# Set the index name
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
require 'test_helper'
2+
3+
module Elasticsearch
4+
module Model
5+
class DynamicIndexNameTest < Elasticsearch::Test::IntegrationTestCase
6+
7+
class ::ArticleWithDynamicIndexName < ActiveRecord::Base
8+
include Elasticsearch::Model
9+
include Elasticsearch::Model::Callbacks
10+
11+
class << self
12+
attr_accessor :year
13+
end
14+
15+
mapping { indexes :title }
16+
index_name { "articles-#{year}" }
17+
end
18+
19+
context "Dynamic index name" do
20+
setup do
21+
ActiveRecord::Schema.define(:version => 1) do
22+
create_table :article_with_dynamic_index_names do |t|
23+
t.string :title
24+
end
25+
end
26+
end
27+
28+
should 'evaluate the index_name value' do
29+
ArticleWithDynamicIndexName.year = '2014'
30+
31+
assert_equal ArticleWithDynamicIndexName.index_name, "articles-2014"
32+
end
33+
34+
should 'reevaluate the index_name value each time' do
35+
ArticleWithDynamicIndexName.year = '2015'
36+
37+
assert_equal ArticleWithDynamicIndexName.index_name, "articles-2015"
38+
end
39+
40+
should "write and read at the the defined index" do
41+
ArticleWithDynamicIndexName.year = '2016'
42+
43+
ArticleWithDynamicIndexName.delete_all
44+
ArticleWithDynamicIndexName.__elasticsearch__.create_index! force: true
45+
46+
::ArticleWithDynamicIndexName.create! title: 'Test'
47+
48+
ArticleWithDynamicIndexName.__elasticsearch__.refresh_index!
49+
50+
response = ArticleWithDynamicIndexName.search(query: { match_all: {} })
51+
52+
assert_equal response.results.total, 1
53+
assert_equal response.search.definition[:index], ArticleWithDynamicIndexName.index_name
54+
assert_equal response.search.definition[:index], 'articles-2016'
55+
end
56+
end
57+
58+
end
59+
end
60+
end

elasticsearch-model/test/unit/naming_test.rb

+27
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ class DummyNamingModelInNamespace
4040
d = DummyNamingModel.new
4141
d.index_name 'foobar_d'
4242
assert_equal 'foobar_d', d.index_name
43+
44+
modifier = 'r'
45+
d.index_name Proc.new{ "foobar_#{modifier}" }
46+
assert_equal 'foobar_r', d.index_name
47+
48+
modifier = 'z'
49+
assert_equal 'foobar_z', d.index_name
50+
51+
modifier = 'f'
52+
d.index_name { "foobar_#{modifier}" }
53+
assert_equal 'foobar_f', d.index_name
54+
55+
modifier = 't'
56+
assert_equal 'foobar_t', d.index_name
4357
end
4458

4559
should "set the index_name with setter" do
@@ -51,6 +65,19 @@ class DummyNamingModelInNamespace
5165
assert_equal 'foobar_index_s', d.index_name
5266

5367
assert_equal 'foobar_index_S', DummyNamingModel.index_name
68+
69+
modifier2 = 'y'
70+
DummyNamingModel.index_name = Proc.new{ "foobar_index_#{modifier2}" }
71+
assert_equal 'foobar_index_y', DummyNamingModel.index_name
72+
73+
modifier = 'r'
74+
d.index_name = Proc.new{ "foobar_index_#{modifier}" }
75+
assert_equal 'foobar_index_r', d.index_name
76+
77+
modifier = 'z'
78+
assert_equal 'foobar_index_z', d.index_name
79+
80+
assert_equal 'foobar_index_y', DummyNamingModel.index_name
5481
end
5582

5683
should "set and return the document_type" do

0 commit comments

Comments
 (0)