easy_model 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -1,34 +1,81 @@
1
1
  = easy_model
2
2
 
3
- データベースに依存しないモデルの基本クラスや, ActiveRecord と同じ型変換を行う属性定義メソッドを提供します.
3
+ データベースに関連付かないモデルの基本クラスや,
4
+ 代入時に ActiveRecord と同じ型変換が行われる属性を定義する機能を提供します.
4
5
 
5
- == データベースに依存しないモデル
6
+ == データベースに関連付かないモデル, 属性
6
7
 
7
- EasyModel::Base クラスを継承することでデータベースに依存しないモデルを手軽に作成できます.
8
- column メソッドを利用することで, ActiveRecord と同じ型変換が行われる属性を定義することができます.
9
- 例として, 会員のログイン情報を保持するモデルは以下のように定義することができます.
8
+ Rails3 ではネーミングルールやバリデーションを扱う機能がモジュール分けされているため,
9
+ それらのモジュールを再利用することでデータベースに関連付かないモデルを作成することができます.
10
+ コーディング自体は簡単ですが, いくつもあるモジュールを include するコードを何度も書くことは手間です.
11
+
12
+ EasyModel::Base はデータベースに関連付かないモデルの基本クラスです.
13
+ 以下のように EasyModel::Base を継承すれば, そのような手間を省くことができます.
14
+
15
+ #
16
+ # ログインフォーム.
17
+ #
18
+ class LoginForm < EasyModel::Base
19
+
20
+ ...
21
+
22
+ end
23
+
24
+ 属性を定義する場合は, 以下のように attr_accessor ではなく column メソッドを利用すると便利です.
25
+ column メソッドを利用すると, 属性の型とデフォルト値を指定することができます.
10
26
 
11
27
  #
12
- # 会員ログインフォーム.
28
+ # ログインフォーム.
13
29
  #
14
- class UserLoginForm < EasyModel::Base
30
+ class LoginForm < EasyModel::Base
15
31
 
16
32
  # 会員番号.
17
33
  column :member_no, :integer
18
- validates :member_no, :presence => true
34
+
35
+ validates :member_no,
36
+ :presence => true,
37
+ :numericality => {:only_integer => true}
19
38
 
20
39
  # パスワード.
21
40
  column :password, :string
22
- validates :password, :presence => true
41
+
42
+ validates :password,
43
+ :presence => true
23
44
 
24
45
  # ログイン状態を保持する (デフォルトは true).
25
46
  column :remember, :boolean, :default => true
26
47
 
27
48
  end
28
49
 
50
+ column メソッドで定義した属性は, 代入時に ActiveRecord と同様の型変換が行われます.
51
+
52
+ login_form = LoginForm.new(:member_no => '1234567',
53
+ :password => 'PASSWORD',
54
+ :remember => 'false')
55
+
56
+ login_form.member_no # => 1234567
57
+ login_form.member_no_before_type_cast # => '1234567'
58
+ login_form.password # => 'PASSWORD'
59
+ login_form.password_before_type_cast # => 'PASSWORD'
60
+ login_form.remember # => false
61
+ login_form.remember_before_type_cast # => 'false'
62
+
63
+ データベースのテーブルに関連付いているモデルでも column メソッドを利用したい場合は,
64
+ EasyModel::Column モジュールを include します.
65
+
66
+ class User < ActiveRecord::Base
67
+
68
+ include EasyModel::Column
69
+
70
+ column ...
71
+
72
+ end
73
+
74
+
75
+
29
76
  == 検索フォーム
30
77
 
31
- 検索フォームを表すモデルを作成する場合は, EasyModel::SearchForm を継承すると便利です.
78
+ 検索フォームを表すモデルを作成する場合は, EasyModel::SearchForm を利用すると便利です.
32
79
  EasyModel::SearchForm は EasyModel::Base に検索用に便利な機能を追加したクラスです.
33
80
  EasyModel::SearchForm を継承したクラスは ActiveRecord::Relation を返す scoped メソッドを定義する必要があります.
34
81
 
@@ -42,8 +89,9 @@ EasyModel::SearchForm を継承したクラスは ActiveRecord::Relation を返
42
89
  # 会員名.
43
90
  column :name, :string
44
91
 
45
- # 会員ステータス.
92
+ # ステータス.
46
93
  column :status, :integer
94
+
47
95
  validates :status, :inclusion => [1, 2, 3]
48
96
 
49
97
  #
@@ -56,7 +104,7 @@ EasyModel::SearchForm を継承したクラスは ActiveRecord::Relation を返
56
104
  scoped = scoped.where(:name => name) if self.name.present?
57
105
  scoped = scoped.where(:status => status) if self.status.present?
58
106
 
59
- # 検索条件を含む scope
107
+ # 検索条件を含む scope を返す.
60
108
  scoped
61
109
  end
62
110
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.0.3
data/easy_model.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "easy_model"
8
- s.version = "1.0.2"
8
+ s.version = "1.0.3"
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 = "2012-07-28"
12
+ s.date = "2012-07-30"
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 = [
@@ -40,8 +40,14 @@ module EasyModel::Column::ClassMethods
40
40
  def column(name, type, options={})
41
41
  ActiveRecord::ConnectionAdapters::Column.new(name, options[:default], type, true).tap do |column|
42
42
  define_method("#{name}=") do |value|
43
+ value = nil if column.number? and value.kind_of?(String) and value.blank?
44
+ instance_variable_set("@#{name}_before_type_cast", value)
43
45
  instance_variable_set("@#{name}", column.type_cast(value))
44
46
  end
47
+ define_method("#{name}_before_type_cast") do
48
+ instance_variable_set("@#{name}_before_type_cast", column.default) unless instance_variable_defined?("@#{name}_before_type_cast")
49
+ instance_variable_get("@#{name}_before_type_cast")
50
+ end
45
51
  define_method(name) do
46
52
  instance_variable_set("@#{name}", column.default) unless instance_variable_defined?("@#{name}")
47
53
  instance_variable_get("@#{name}")
@@ -7,7 +7,36 @@ class EasyModel::TestColumn < Test::Unit::TestCase
7
7
  def test_has_column_method
8
8
  model = Class.new
9
9
  model.send(:include, EasyModel::Column)
10
+ model.send(:column, :integer_column, :integer)
10
11
  assert model.protected_methods.include?(:column)
12
+
13
+ object = model.new
14
+ assert object.respond_to?(:integer_column)
15
+ assert object.respond_to?(:integer_column=)
16
+ assert object.respond_to?(:integer_column_before_type_cast)
17
+ end
18
+
19
+ def test_before_type_cast
20
+ model = Class.new
21
+ model.send(:include, EasyModel::Column)
22
+ model.send(:column, :integer_column, :integer)
23
+ object = model.new
24
+
25
+ object.integer_column = ''
26
+ assert_nil object.integer_column
27
+ assert_nil object.integer_column_before_type_cast
28
+
29
+ object.integer_column = '777'
30
+ assert_equal 777, object.integer_column
31
+ assert_equal '777', object.integer_column_before_type_cast
32
+
33
+ object.integer_column = true
34
+ assert_equal 1, object.integer_column
35
+ assert_equal true, object.integer_column_before_type_cast
36
+
37
+ object.integer_column = false
38
+ assert_equal 0, object.integer_column
39
+ assert_equal false, object.integer_column_before_type_cast
11
40
  end
12
41
 
13
42
  def test_string_column
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-28 00:00:00.000000000 Z
12
+ date: 2012-07-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
- requirement: &74044560 !ruby/object:Gem::Requirement
16
+ requirement: &71228770 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *74044560
24
+ version_requirements: *71228770
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &74044160 !ruby/object:Gem::Requirement
27
+ requirement: &71228330 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *74044160
35
+ version_requirements: *71228330
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rdoc
38
- requirement: &74043530 !ruby/object:Gem::Requirement
38
+ requirement: &71227660 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.12'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *74043530
46
+ version_requirements: *71227660
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &74042540 !ruby/object:Gem::Requirement
49
+ requirement: &71226630 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *74042540
57
+ version_requirements: *71226630
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &74041700 !ruby/object:Gem::Requirement
60
+ requirement: &71225660 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.8.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *74041700
68
+ version_requirements: *71225660
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &74038960 !ruby/object:Gem::Requirement
71
+ requirement: &71224630 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *74038960
79
+ version_requirements: *71224630
80
80
  description: データベースに依存しないモデルの基本クラスや, ActiveRecord と同じ型変換を行う属性定義メソッドを提供します.
81
81
  email: info-techscore@synergy101.jp
82
82
  executables: []
@@ -114,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
114
  version: '0'
115
115
  segments:
116
116
  - 0
117
- hash: -297077907
117
+ hash: -442526499
118
118
  required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements: