easy_model 1.0.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -2
- data/README.rdoc +32 -78
- data/README_ja.rdoc +104 -0
- data/VERSION +1 -1
- data/easy_model.gemspec +15 -14
- data/lib/easy_model/base.rb +2 -58
- data/lib/easy_model/column.rb +6 -42
- data/lib/easy_model/column_for_active_model.rb +116 -0
- data/lib/easy_model/column_for_active_record.rb +95 -0
- data/lib/easy_model/search_form.rb +3 -1
- data/test/easy_model/test_column_for_active_model.rb +355 -0
- data/test/easy_model/{test_column.rb → test_column_for_active_record.rb} +107 -41
- data/test/easy_model/test_search_form.rb +6 -0
- data/test/helper.rb +1 -1
- metadata +12 -22
- data/test/easy_model/test_base.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 488a9ff8518bfe55261101a3cf8eb59db5d259af
|
4
|
+
data.tar.gz: a47ae035674368c4a3c356b2b37c7440b71fb938
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e735726fc401878ff30c6d85f77d58e7a4d5346d322488aedb7ec0e03bc03a368912a9df3e0fab1ca65b748774f30847d353db10248c578cbe3f6be1dacdb853
|
7
|
+
data.tar.gz: b1b90d7f46091973c003cc1c39f8a06c5420cde4785449e4e9bfa74e721ba8f364cd17c7b39d80ddbe7e1aee9d1f82f6c4c9b47a9b90bdeee3fea28d62a117d3
|
data/Gemfile
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'activemodel', '~>
|
4
|
-
gem 'activerecord', '~>
|
3
|
+
gem 'activemodel', '~> 4.0'
|
4
|
+
gem 'activerecord', '~> 4.0'
|
5
5
|
|
6
6
|
group :development do
|
7
7
|
gem 'rdoc', '>= 3.12'
|
8
8
|
gem 'bundler', '>= 1.0.0'
|
9
9
|
gem 'jeweler', '>= 1.8.4'
|
10
|
+
end
|
11
|
+
|
12
|
+
group :test do
|
10
13
|
gem 'simplecov', '>= 0'
|
14
|
+
gem 'sqlite3'
|
11
15
|
end
|
12
16
|
|
data/README.rdoc
CHANGED
@@ -1,53 +1,23 @@
|
|
1
1
|
= easy_model
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
EasyModel provides features of database independent attribute.
|
4
|
+
You can define the attribute like ActiveRecord that perform data conversion during assignment.
|
5
5
|
|
6
|
-
==
|
6
|
+
== Define database independent attribute
|
7
7
|
|
8
|
-
|
9
|
-
それらのモジュールを再利用することでデータベースに関連付かないモデルを作成することができます.
|
10
|
-
コーディング自体は簡単ですが, いくつもあるモジュールを include するコードを何度も書くことは手間です.
|
8
|
+
First, include EasyModel to your model. Next define attribute by `column` method.
|
11
9
|
|
12
|
-
|
13
|
-
以下のように EasyModel::Base を継承すれば, そのような手間を省くことができます.
|
10
|
+
class LoginForm
|
14
11
|
|
15
|
-
|
16
|
-
# ログインフォーム.
|
17
|
-
#
|
18
|
-
class LoginForm < EasyModel::Base
|
19
|
-
|
20
|
-
...
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
属性を定義する場合は, 以下のように attr_accessor ではなく column メソッドを使用します.
|
25
|
-
column メソッドを使用すると, 属性の型とデフォルト値を指定することができます.
|
26
|
-
|
27
|
-
#
|
28
|
-
# ログインフォーム.
|
29
|
-
#
|
30
|
-
class LoginForm < EasyModel::Base
|
12
|
+
include EasyModel::Column
|
31
13
|
|
32
|
-
# 会員番号.
|
33
14
|
column :member_no, :integer
|
34
|
-
|
35
|
-
validates :member_no,
|
36
|
-
:presence => true,
|
37
|
-
:numericality => {:only_integer => true}
|
38
|
-
|
39
|
-
# パスワード.
|
40
15
|
column :password, :string
|
41
|
-
|
42
|
-
validates :password,
|
43
|
-
:presence => true
|
44
|
-
|
45
|
-
# ログイン状態を保持する (デフォルトは true).
|
46
|
-
column :remember, :boolean, :default => true
|
16
|
+
column :remember, :boolan, default: false
|
47
17
|
|
48
18
|
end
|
49
19
|
|
50
|
-
column
|
20
|
+
When you assign a value to attribute defined by `column` method, a value is converted to attribute's data type (like ActiveRecord).
|
51
21
|
|
52
22
|
login_form = LoginForm.new(:member_no => '1234567',
|
53
23
|
:password => 'PASSWORD',
|
@@ -60,35 +30,27 @@ column メソッドで定義した属性は, 代入時に ActiveRecord と同様
|
|
60
30
|
login_form.remember # => false
|
61
31
|
login_form.remember_before_type_cast # => 'false'
|
62
32
|
|
63
|
-
|
64
|
-
EasyModel::Base を継承しないモデルでも column メソッドを使用することができます.
|
65
|
-
|
66
|
-
class User < ActiveRecord::Base
|
67
|
-
|
68
|
-
include EasyModel::Column
|
69
|
-
|
70
|
-
column ...
|
33
|
+
== Internationalization
|
71
34
|
|
72
|
-
|
73
|
-
|
74
|
-
== 国際化
|
75
|
-
|
76
|
-
国際化は I18n で行われます.
|
77
|
-
デフォルトでは '<locale>.easy_model' 以下がルックアップされます.
|
35
|
+
EasyModel uses I18n to internationalization.
|
36
|
+
By default, the look up key is `<locale>.easy_model`.
|
78
37
|
|
79
|
-
|
38
|
+
en:
|
80
39
|
easy_model:
|
81
40
|
models:
|
82
|
-
|
41
|
+
login_form: Login form
|
83
42
|
attributes:
|
84
|
-
|
85
|
-
|
86
|
-
|
43
|
+
login_form:
|
44
|
+
member_no: Member number
|
45
|
+
password: Password
|
46
|
+
remember: Keep the login state.
|
87
47
|
|
88
|
-
|
89
|
-
|
48
|
+
By define the `i18n_scope` method, you can change the look up key.
|
49
|
+
For example, to use the look up key same as ActiveRecord:
|
90
50
|
|
91
|
-
class
|
51
|
+
class LoginForm
|
52
|
+
|
53
|
+
include EasyModel::Column
|
92
54
|
|
93
55
|
def self.i18n_scope
|
94
56
|
:activerecord
|
@@ -96,45 +58,37 @@ EasyModel::Base.i18n_scope を上書きすることで, ルックアップされ
|
|
96
58
|
|
97
59
|
end
|
98
60
|
|
99
|
-
==
|
61
|
+
== Search form
|
100
62
|
|
101
|
-
|
102
|
-
EasyModel::SearchForm
|
103
|
-
|
63
|
+
EasyModel::SearchForm is useful to create search form model.
|
64
|
+
EasyModel::SearchForm includes EasyModel::Column, and provides useful features to searching.
|
65
|
+
Only define the `scoped` method, you can use query method same as ActiveRecord.
|
104
66
|
|
105
|
-
|
67
|
+
For example:
|
106
68
|
|
107
|
-
#
|
108
|
-
# 会員検索フォーム.
|
109
|
-
#
|
110
69
|
class UserSearchForm < EasyModel::SearchForm
|
111
70
|
|
112
|
-
# 会員名.
|
113
71
|
column :name, :string
|
114
72
|
|
115
|
-
# ステータス.
|
116
73
|
column :status, :integer
|
117
74
|
|
118
75
|
validates :status, :inclusion => [1, 2, 3]
|
119
76
|
|
120
|
-
#
|
121
|
-
# 検索条件を保持する ActiveRecord::Relation を返す.
|
122
|
-
#
|
123
77
|
def scoped
|
124
|
-
scoped = User.
|
78
|
+
scoped = User.all
|
125
79
|
|
126
|
-
#
|
80
|
+
# Add to conditions if value is present.
|
127
81
|
scoped = scoped.where(:name => name) if self.name.present?
|
128
82
|
scoped = scoped.where(:status => status) if self.status.present?
|
129
83
|
|
130
|
-
#
|
84
|
+
# Return scope including search conditions.
|
131
85
|
scoped
|
132
86
|
end
|
133
87
|
|
134
88
|
end
|
135
89
|
|
136
|
-
|
137
|
-
|
90
|
+
Query methods (i.e. find, all, ...) is delegated to `scoped` method.
|
91
|
+
So, you can use the interface same as ActiveRecord::Relation.
|
138
92
|
|
139
93
|
user_search_form = UserSearchForm.new(params[:user_search_form])
|
140
94
|
|
data/README_ja.rdoc
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
= easy_model
|
2
|
+
|
3
|
+
データベースに関連付かない属性を定義する機能を提供します.
|
4
|
+
代入時に ActiveRecord と同様の型変換が行われる属性を定義することができます.
|
5
|
+
|
6
|
+
== データベースに関連付かない属性の定義
|
7
|
+
|
8
|
+
EasyModel::Column モジュールを include し, column メソッドで属性を定義します.
|
9
|
+
|
10
|
+
class LoginForm
|
11
|
+
|
12
|
+
include EasyModel::Column
|
13
|
+
|
14
|
+
column :member_no, :integer
|
15
|
+
column :password, :string
|
16
|
+
column :remember, :boolan, default: false
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
column メソッドで定義した属性は ActiveRecord と同様のデータ型変換が行われます.
|
21
|
+
|
22
|
+
login_form = LoginForm.new(:member_no => '1234567',
|
23
|
+
:password => 'PASSWORD',
|
24
|
+
:remember => 'false')
|
25
|
+
|
26
|
+
login_form.member_no # => 1234567
|
27
|
+
login_form.member_no_before_type_cast # => '1234567'
|
28
|
+
login_form.password # => 'PASSWORD'
|
29
|
+
login_form.password_before_type_cast # => 'PASSWORD'
|
30
|
+
login_form.remember # => false
|
31
|
+
login_form.remember_before_type_cast # => 'false'
|
32
|
+
|
33
|
+
== 国際化
|
34
|
+
|
35
|
+
国際化は I18n で行われます.
|
36
|
+
デフォルトでは '<locale>.easy_model' 以下がルックアップされます.
|
37
|
+
|
38
|
+
ja:
|
39
|
+
easy_model:
|
40
|
+
models:
|
41
|
+
login_form: ログインフォーム
|
42
|
+
attributes:
|
43
|
+
login_form:
|
44
|
+
member_no: 会員番号
|
45
|
+
password: パスワード
|
46
|
+
remember: ログイン状態を記憶する
|
47
|
+
|
48
|
+
i18n_scope メソッドを上書きすることで, ルックアップされるキーを変更することができます.
|
49
|
+
例えば, ActiveRecord と同じキーを参照させたい場合は, 以下のように上書きします.
|
50
|
+
|
51
|
+
class LoginForm
|
52
|
+
|
53
|
+
include EasyModel::Column
|
54
|
+
|
55
|
+
def self.i18n_scope
|
56
|
+
:activerecord
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
== 検索フォーム
|
62
|
+
|
63
|
+
検索フォームを表すモデルを作成する場合は EasyModel::SearchForm を利用すると便利です.
|
64
|
+
EasyModel::SearchForm は EasyModel::Column を include した上で検索に便利な機能を追加したクラスです.
|
65
|
+
scoped メソッドを定義するだけで ActiveRecord が持つ検索形のメソッドなどを利用できるようになります.
|
66
|
+
|
67
|
+
以下に実装例を示します.
|
68
|
+
|
69
|
+
class UserSearchForm < EasyModel::SearchForm
|
70
|
+
|
71
|
+
column :name, :string
|
72
|
+
|
73
|
+
column :status, :integer
|
74
|
+
|
75
|
+
validates :status, :inclusion => [1, 2, 3]
|
76
|
+
|
77
|
+
def scoped
|
78
|
+
scoped = User.scoped
|
79
|
+
|
80
|
+
# 値が設定されている場合のみ検索条件に加える.
|
81
|
+
scoped = scoped.where(:name => name) if self.name.present?
|
82
|
+
scoped = scoped.where(:status => status) if self.status.present?
|
83
|
+
|
84
|
+
# 検索条件を含む scope を返す.
|
85
|
+
scoped
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
EasyModel::SearchForm は find や all などのメソッドを scoped メソッドに移譲します.
|
91
|
+
そのため, 次のように ActiveRecord::Relation と同じインタフェースで利用することができます.
|
92
|
+
|
93
|
+
user_search_form = UserSearchForm.new(params[:user_search_form])
|
94
|
+
|
95
|
+
if user_search_form.valid?
|
96
|
+
users = user_search_form.all
|
97
|
+
else
|
98
|
+
...
|
99
|
+
end
|
100
|
+
|
101
|
+
== Copyright
|
102
|
+
|
103
|
+
Copyright (c) 2012 Synergy Marketing, Inc. See LICENSE.txt for further details.
|
104
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
data/easy_model.gemspec
CHANGED
@@ -5,31 +5,35 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "easy_model"
|
8
|
-
s.version = "
|
8
|
+
s.version = "2.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["SUZUKI Kei"]
|
12
|
-
s.date = "2013-10-
|
12
|
+
s.date = "2013-10-14"
|
13
13
|
s.description = "\u{30c7}\u{30fc}\u{30bf}\u{30d9}\u{30fc}\u{30b9}\u{306b}\u{4f9d}\u{5b58}\u{3057}\u{306a}\u{3044}\u{30e2}\u{30c7}\u{30eb}\u{306e}\u{57fa}\u{672c}\u{30af}\u{30e9}\u{30b9}\u{3084}, ActiveRecord \u{3068}\u{540c}\u{3058}\u{578b}\u{5909}\u{63db}\u{3092}\u{884c}\u{3046}\u{5c5e}\u{6027}\u{5b9a}\u{7fa9}\u{30e1}\u{30bd}\u{30c3}\u{30c9}\u{3092}\u{63d0}\u{4f9b}\u{3057}\u{307e}\u{3059}."
|
14
14
|
s.email = "info-techscore@synergy101.jp"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
|
-
"README.rdoc"
|
17
|
+
"README.rdoc",
|
18
|
+
"README_ja.rdoc"
|
18
19
|
]
|
19
20
|
s.files = [
|
20
21
|
"Gemfile",
|
21
22
|
"LICENSE.txt",
|
22
23
|
"README.rdoc",
|
24
|
+
"README_ja.rdoc",
|
23
25
|
"Rakefile",
|
24
26
|
"VERSION",
|
25
27
|
"easy_model.gemspec",
|
26
28
|
"lib/easy_model.rb",
|
27
29
|
"lib/easy_model/base.rb",
|
28
30
|
"lib/easy_model/column.rb",
|
31
|
+
"lib/easy_model/column_for_active_model.rb",
|
32
|
+
"lib/easy_model/column_for_active_record.rb",
|
29
33
|
"lib/easy_model/search_form.rb",
|
30
34
|
"test/easy_model/ja.yml",
|
31
|
-
"test/easy_model/
|
32
|
-
"test/easy_model/
|
35
|
+
"test/easy_model/test_column_for_active_model.rb",
|
36
|
+
"test/easy_model/test_column_for_active_record.rb",
|
33
37
|
"test/easy_model/test_search_form.rb",
|
34
38
|
"test/helper.rb"
|
35
39
|
]
|
@@ -43,27 +47,24 @@ Gem::Specification.new do |s|
|
|
43
47
|
s.specification_version = 4
|
44
48
|
|
45
49
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
-
s.add_runtime_dependency(%q<activemodel>, ["~>
|
47
|
-
s.add_runtime_dependency(%q<activerecord>, ["~>
|
50
|
+
s.add_runtime_dependency(%q<activemodel>, ["~> 4.0"])
|
51
|
+
s.add_runtime_dependency(%q<activerecord>, ["~> 4.0"])
|
48
52
|
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
49
53
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
50
54
|
s.add_development_dependency(%q<jeweler>, [">= 1.8.4"])
|
51
|
-
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
52
55
|
else
|
53
|
-
s.add_dependency(%q<activemodel>, ["~>
|
54
|
-
s.add_dependency(%q<activerecord>, ["~>
|
56
|
+
s.add_dependency(%q<activemodel>, ["~> 4.0"])
|
57
|
+
s.add_dependency(%q<activerecord>, ["~> 4.0"])
|
55
58
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
56
59
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
57
60
|
s.add_dependency(%q<jeweler>, [">= 1.8.4"])
|
58
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
59
61
|
end
|
60
62
|
else
|
61
|
-
s.add_dependency(%q<activemodel>, ["~>
|
62
|
-
s.add_dependency(%q<activerecord>, ["~>
|
63
|
+
s.add_dependency(%q<activemodel>, ["~> 4.0"])
|
64
|
+
s.add_dependency(%q<activerecord>, ["~> 4.0"])
|
63
65
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
64
66
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
65
67
|
s.add_dependency(%q<jeweler>, [">= 1.8.4"])
|
66
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
data/lib/easy_model/base.rb
CHANGED
@@ -1,67 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require 'active_model'
|
4
|
-
|
5
|
-
#
|
6
|
-
# テーブルに依存しないモデルの基本クラス.
|
7
|
-
#
|
8
3
|
class EasyModel::Base
|
9
4
|
|
10
|
-
extend ActiveModel::Naming
|
11
|
-
include ActiveModel::Conversion
|
12
|
-
include ActiveModel::Validations
|
13
5
|
include EasyModel::Column
|
14
6
|
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
def self.i18n_scope
|
19
|
-
:easy_model
|
20
|
-
end
|
21
|
-
|
22
|
-
#
|
23
|
-
# 指定された属性値で初期化する.
|
24
|
-
#
|
25
|
-
# ==== 引数
|
26
|
-
# attributes::
|
27
|
-
# 属性名と属性値を保持する Hash.
|
28
|
-
#
|
29
|
-
def initialize(attributes=nil)
|
30
|
-
assign_attributes(attributes)
|
31
|
-
end
|
32
|
-
|
33
|
-
#
|
34
|
-
# 属性を一括代入する.
|
35
|
-
#
|
36
|
-
# ==== 引数
|
37
|
-
# new_attributes::
|
38
|
-
# 属性名と属性値を保持する Hash.
|
39
|
-
#
|
40
|
-
def attributes=(new_attributes)
|
41
|
-
assign_attributes(new_attributes)
|
42
|
-
end
|
43
|
-
|
44
|
-
#
|
45
|
-
# 属性を一括代入する.
|
46
|
-
#
|
47
|
-
# ==== 引数
|
48
|
-
# new_attributes::
|
49
|
-
# 属性名と属性値を保持する Hash.
|
50
|
-
#
|
51
|
-
def assign_attributes(new_attributes)
|
52
|
-
(new_attributes || {}).each do |name, value|
|
53
|
-
send("#{name}=", value)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
#
|
58
|
-
# オブジェクトが永続化されているか判定する.
|
59
|
-
#
|
60
|
-
# ==== 戻り値
|
61
|
-
# DB に関連付かないモデルのため常に false.
|
62
|
-
#
|
63
|
-
def persisted?
|
64
|
-
false
|
7
|
+
def self.inherited(base)
|
8
|
+
$stderr.puts 'DEPRECATED: EasyModel::Base is deprecated. Instead to include EasyModel::Column.'
|
65
9
|
end
|
66
10
|
|
67
11
|
end
|