rails_dictionary 0.0.7 → 0.0.8
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/.gitignore +1 -0
- data/README.rdoc +55 -63
- data/lib/rails_dictionary/acts_as_dict_type.rb +1 -1
- data/lib/rails_dictionary/version.rb +1 -1
- data/lib/tasks/dicts.rake +21 -0
- data/rails_dictionary.gemspec +2 -2
- data/test/rails_dictionary_test.rb +0 -1
- metadata +7 -5
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg/
|
data/README.rdoc
CHANGED
@@ -1,44 +1,58 @@
|
|
1
1
|
= Intro
|
2
2
|
There are many static data in application.
|
3
|
-
|
3
|
+
For example in a student application,there may be some static data like diploma kind,school and city of school.This gem can map these static data to a Dictionary#method like Dictionary#student_diploma_kind which return data list of diploma kind and generate a list of instance method on Student like @student.named_city which return city name of @student city
|
4
4
|
|
5
5
|
= Usage
|
6
6
|
== Installation
|
7
7
|
Rail3
|
8
|
-
gem "rails_dictionary",:git => 'git://github.com/raykin/rails_dictionary'
|
9
|
-
or
|
10
8
|
gem 'rails_dictionary'
|
9
|
+
or
|
10
|
+
gem "rails_dictionary",:git => 'git://github.com/raykin/rails_dictionary'
|
11
11
|
|
12
12
|
== Sample
|
13
|
-
|
13
|
+
Run following task will give you a simple start.Maybe you should try it in a new application first.
|
14
|
+
rake dicts:generate
|
15
|
+
rake dicts:sample_slave
|
16
|
+
rake db:migrate
|
17
|
+
rake dicts:sample_data
|
18
|
+
These task are just generate table dictionaries,dict_types,students and some sample data.The data should be
|
19
|
+
irb(main):013:0> DictType.select("id,name").all
|
20
|
+
DictType Load (0.4ms) SELECT id,name FROM `dict_types`
|
21
|
+
+----+----------------+
|
22
|
+
| id | name |
|
23
|
+
+----+----------------+
|
24
|
+
| 1 | student_city |
|
25
|
+
| 2 | student_school |
|
26
|
+
+----+----------------+
|
27
|
+
2 rows in set
|
28
|
+
irb(main):014:0> Dictionary.select("id,name_en,name_zh,name_fr,dict_type_id").all
|
29
|
+
Dictionary Load (1.2ms) SELECT id,name_en,name_zh,name_fr,dict_type_id FROM `dictionaries`
|
30
|
+
+----+----------+---------+----------+--------------+
|
31
|
+
| id | name_en | name_zh | name_fr | dict_type_id |
|
32
|
+
+----+----------+---------+----------+--------------+
|
33
|
+
| 1 | shanghai | 上海 | shanghai | 1 |
|
34
|
+
| 2 | beijing | 北京 | Pékin | 1 |
|
35
|
+
+----+----------+---------+----------+--------------+
|
36
|
+
2 rows in set
|
37
|
+
irb(main):016:0> Student.select("id,email,city,school").all
|
38
|
+
Student Load (0.4ms) SELECT id,email,city,school FROM `students`
|
39
|
+
+----+-------------------+------+--------+
|
40
|
+
| id | email | city | school |
|
41
|
+
+----+-------------------+------+--------+
|
42
|
+
| 1 | beijing@dict.com | 4 | |
|
43
|
+
| 2 | shanghai@dict.com | 3 | |
|
44
|
+
+----+-------------------+------+--------+
|
45
|
+
2 rows in set
|
46
|
+
There is one conventions of DictType.name value.All value of DictType.name is "model_method" : student is model and city is method of student model.
|
47
|
+
|
14
48
|
=== Table Definition
|
15
49
|
Make sure you have two tables which named as dict_types and dictionaries.
|
16
|
-
|
17
|
-
|
18
|
-
The students table is not required.
|
19
|
-
|
20
|
-
create_table :dict_types do |t|
|
21
|
-
t.string :name
|
22
|
-
t.string :comment
|
23
|
-
t.timestamps
|
24
|
-
end
|
25
|
-
create_table :dictionaries do |t|
|
26
|
-
t.string :name_en
|
27
|
-
t.string :name_zh
|
28
|
-
t.string :name_fr
|
29
|
-
t.integer :dict_type_id
|
30
|
-
t.timestamps
|
31
|
-
end
|
32
|
-
create_table :students do |t|
|
33
|
-
t.string :email
|
34
|
-
t.integer :city
|
35
|
-
t.integer :school
|
36
|
-
t.timestamps
|
37
|
-
end
|
50
|
+
Table dictionaries has one convention of naming column : name_locale.So the name_fr means this column have a french value,you can see more usage later.
|
51
|
+
The students table is not required and variable by your application.
|
38
52
|
|
39
53
|
=== Class Definition
|
40
|
-
Method acts_as_dict_type,acts_as_dictionary,acts_as_dict_slave like other simple gem method used as class method.
|
41
54
|
Here is what should be like.Student model can be other models.
|
55
|
+
|
42
56
|
class DictType < ActiveRecord::Base
|
43
57
|
acts_as_dict_type
|
44
58
|
end
|
@@ -51,42 +65,23 @@ Here is what should be like.Student model can be other models.
|
|
51
65
|
acts_as_dict_slave
|
52
66
|
end
|
53
67
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
Dictionary
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
Dictionary.count => 2
|
63
|
-
Dictionary.find(5) =>
|
64
|
-
#<Dictionary id: 1, name_en: "shanghai", name_zh: "上海", name_fr: "shanghai", dict_type_id: 1, created_at: "2011-02-27 13:28:55", updated_at: "2011-02-27 13:28:55">
|
65
|
-
Dictionary.find(6) =>
|
66
|
-
#<Dictionary id: 2, name_en: "beijing", name_zh: "北京", name_fr: "Pékin", dict_type_id: 1, created_at: "2011-02-27 13:28:55", updated_at: "2011-02-27 13:28:55">
|
67
|
-
Student.find(1) =>
|
68
|
-
#<Student id: 1, email: "beijing@dict.com", city: 6, school: nil, created_at: "2011-02-27 13:28:55", updated_at: "2011-02-27 13:28:55">
|
69
|
-
Student.find(2) =>
|
70
|
-
#<Student id: 2, email: "shanghai@dict.com", city: 5, school: nil, created_at: "2011-02-27 13:28:55", updated_at: "2011-02-27 13:28:55">
|
71
|
-
|
72
|
-
== Methods and results (relies on the above data)
|
73
|
-
DictType.all_cached => return cache of DictType.all
|
74
|
-
DictType.all_types => %w[student_city student_school]
|
75
|
-
Dictionary.student_city => [Dictionary.find(5),Dictionary.find(6)]
|
76
|
-
# student_city is a dynamic method which returns a list of dictionary object which dict_type is student_city.Actually Dictionary will has as many dynamic methods as DictType.count and the dynamic method name is DictType.name,so there is another dynamic method which return nil
|
77
|
-
Dictionary.student_school => []
|
78
|
-
Dictionary.student_city(:locale => :en) => [["shanghai",1],["beijing",2]]
|
79
|
-
so you can use these method in form select like
|
68
|
+
== Features : Methods and results (relies on the above data)
|
69
|
+
DictType.all_cached #=> return cache of DictType.all
|
70
|
+
DictType.all_types = %w[student_city student_school] # also cached
|
71
|
+
Dictionary.student_city #=> [Dictionary.find(5),Dictionary.find(6)]
|
72
|
+
student_city is a dynamic method which returns a list of dictionary object which dict_type is "student_city".Actually Dictionary will have as many dynamic methods as DictType.count and each dynamic method name is DictType.name(This methods returning an array,not ActiveRelation).
|
73
|
+
Dictionary.student_school = []
|
74
|
+
Dictionary.student_city :locale => :en = [["shanghai",1],["beijing",2]]
|
75
|
+
You can use it in form select method like
|
80
76
|
collection_select :student,:city,Dictionary.student_city,:id,:name_en
|
81
77
|
select :student,:city,Dictionary.student_city(params)
|
82
|
-
|
83
|
-
Student.find(1).named_city = "beijing"
|
78
|
+
If params contains :locale => :fr,it returns a list of french name of student city (from name_fr in Dictioanry)
|
79
|
+
Student.find(1).named_city = "beijing" # when default locale is :en
|
84
80
|
Here is an other solution for international translation.
|
85
81
|
Student.find(1).named_city(:zh) = "北京"
|
86
82
|
Student.find(1).named_city(:fr) = "Pékin"
|
87
|
-
Student has
|
88
|
-
Student.find(1).city_dict
|
89
|
-
|
83
|
+
Student has two belongs_to assocition which named as city_dict and school_dict,the naming convention is method_dict.
|
84
|
+
Student.find(1).city_dict #=> Dictionary.find(6)
|
90
85
|
|
91
86
|
= Practical Suggestion
|
92
87
|
If you start a new application and there are more than 10 kinds of static data,you may have a try with the gem.
|
@@ -96,14 +91,11 @@ However,if you see many static data in an old system and want to refactor it,the
|
|
96
91
|
The most used debug method would be DictType.all_types and Dictionary.student_city(or other dynamic generate method)
|
97
92
|
When you get some confused with the output of these method,try running
|
98
93
|
rails tmp:clear
|
99
|
-
cause these methods all return static data,I just caches these output for better performance.If you change db data in db console(not through Rails) like running
|
94
|
+
cause these methods all return static data(may be a mass of data),I just caches these output for better performance.If you change db data in db console(not through Rails) like running
|
100
95
|
delete from dict_types;
|
101
96
|
The rails cache would not refresh.
|
102
97
|
In short,when you confused with the debug data,try running "rails tmp:clear" first.
|
103
98
|
|
104
99
|
= TODO & Problems
|
105
100
|
There are no convention and implemention to map Class like Ckeditor::Asset to a method.
|
106
|
-
|
107
|
-
|
108
|
-
= Help
|
109
|
-
Need an friendly english native guy to help me improve this readme to make it more clear and readable.
|
101
|
+
Rewrite Testing,make it more maintainable.
|
@@ -30,7 +30,7 @@ module ActsAsDictType
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# TODO: get a more accurate method name
|
33
|
-
#
|
33
|
+
# Parse the name value to get which column and model are listed in DictType
|
34
34
|
def self.tab_and_column
|
35
35
|
tab_and_column={}
|
36
36
|
# There are two chooses,one is subclasses the other is descendants,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
namespace :dicts do
|
3
|
+
desc "Generate dictionary and dict_type model"
|
4
|
+
task :generate do
|
5
|
+
system "rails g model dictionary name_en:string name_zh:string name_fr:string dict_type_id:integer"
|
6
|
+
system "rails g model dict_type name:string"
|
7
|
+
end
|
8
|
+
desc "Generate student model"
|
9
|
+
task :sample_slave do
|
10
|
+
system "rails g model student email:string city:integer school:integer"
|
11
|
+
end
|
12
|
+
desc "Generate sample data for rails_dictionary gem"
|
13
|
+
task :sample_data => [:environment] do
|
14
|
+
@dt_stu_city=DictType.create! :name => "student_city"
|
15
|
+
@dt_stu_school=DictType.create! :name => "student_school"
|
16
|
+
@dy_shanghai=Dictionary.create! name_en: "shanghai",name_zh: "上海",name_fr: "shanghai",dict_type_id: @dt_stu_city.id
|
17
|
+
@dy_beijing=Dictionary.create! name_en: "beijing",name_zh: "北京",name_fr: "Pékin",dict_type_id: @dt_stu_city.id
|
18
|
+
@stu_beijing=Student.create! email: "beijing@dict.com",city: @dy_beijing.id
|
19
|
+
@stu_shanghai=Student.create! email: "shanghai@dict.com",city: @dy_shanghai.id
|
20
|
+
end
|
21
|
+
end
|
data/rails_dictionary.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["raykin"]
|
10
10
|
s.email = ["raykincoldxiao@campus.com"]
|
11
11
|
s.homepage = "https://github.com/raykin/rails_dictionary"
|
12
|
-
s.summary = %q{dictionary data for application}
|
13
|
-
s.description = %q{mapping static data of web application to Dictionary class}
|
12
|
+
s.summary = %q{dictionary data for web application}
|
13
|
+
s.description = %q{Rails plugin for mapping static data of web application to Dictionary class}
|
14
14
|
|
15
15
|
s.rubyforge_project = "rails_dictionary"
|
16
16
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rails_dictionary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- raykin
|
@@ -10,11 +10,11 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-21 00:00:00 +08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
17
|
-
description: mapping static data of web application to Dictionary class
|
17
|
+
description: Rails plugin for mapping static data of web application to Dictionary class
|
18
18
|
email:
|
19
19
|
- raykincoldxiao@campus.com
|
20
20
|
executables: []
|
@@ -24,6 +24,7 @@ extensions: []
|
|
24
24
|
extra_rdoc_files: []
|
25
25
|
|
26
26
|
files:
|
27
|
+
- .gitignore
|
27
28
|
- Gemfile
|
28
29
|
- README.rdoc
|
29
30
|
- Rakefile
|
@@ -33,6 +34,7 @@ files:
|
|
33
34
|
- lib/rails_dictionary/acts_as_dictionary.rb
|
34
35
|
- lib/rails_dictionary/array_core_ext.rb
|
35
36
|
- lib/rails_dictionary/version.rb
|
37
|
+
- lib/tasks/dicts.rake
|
36
38
|
- rails_dictionary.gemspec
|
37
39
|
- test/rails_dictionary_test.rb
|
38
40
|
has_rdoc: true
|
@@ -59,9 +61,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
61
|
requirements: []
|
60
62
|
|
61
63
|
rubyforge_project: rails_dictionary
|
62
|
-
rubygems_version: 1.6.
|
64
|
+
rubygems_version: 1.6.2
|
63
65
|
signing_key:
|
64
66
|
specification_version: 3
|
65
|
-
summary: dictionary data for application
|
67
|
+
summary: dictionary data for web application
|
66
68
|
test_files:
|
67
69
|
- test/rails_dictionary_test.rb
|