rails_dictionary 0.1.0 → 0.1.1

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
@@ -54,7 +54,7 @@ These task are just generate table dictionaries,dict_types,students and some sam
54
54
  | 2 | shanghai@dict.com | 3 | |
55
55
  +----+-------------------+------+--------+
56
56
  2 rows in set
57
- There is one convention of DictType.name value.All value of DictType.name is "model_method" : student is model and city is method of student model.
57
+ There is one convention on DictType.name .All value of DictType.name is "model_method" : student is model and city is method of student model.
58
58
 
59
59
  === Table Definition
60
60
  Make sure you have two tables which named as dict_types and dictionaries.
@@ -81,11 +81,13 @@ Here is what should be like.Student model can be other models.
81
81
  DictType.all_cached #=> return cache of DictType.all
82
82
  DictType.all_types = [:student_city,:student_school] # also cached
83
83
  Dictionary.student_city #=> [Dictionary.find(5),Dictionary.find(6)]
84
- student_city is a dynamic method which returns a list of dictionary object which dict_type is "student_city".
84
+ student_city is a dynamic method(from method missing) which returns a list of dictionary object which dict_type is "student_city".
85
85
  Actually Dictionary will have as many dynamic methods as DictType.count and each dynamic method name is DictType.name.
86
- Before version 0.1.0 or 0.2.0 ,all dynamic methods return an array,not ActiveRelation.So
86
+ And student_city return an array,not ActiveRelation.So
87
87
  Dictionary.student_school = []
88
88
  Dictionary.student_city :locale => :en #=> [["beijing", 2],["shanghai",1]]
89
+ If you need a ActiveRelation, try scoped_student_city like
90
+ Dictionary.scoped_student_city.where(...)
89
91
  You can use it in form select method like
90
92
  collection_select :student,:city,Dictionary.student_city,:id,:name_en
91
93
  select :student,:city,Dictionary.student_city(params)
@@ -121,7 +123,9 @@ The rails cache would not refresh.
121
123
  In short,when you confused with the debug data,try running "rails tmp:clear" first.
122
124
 
123
125
  = TODO & Problems
124
- Is there any exist low level method to monitor the change of descendents
126
+ Remove engine. Becase for the view layer we can use gem rails_admin. so this gem did not need rails engine.
127
+ Make Dictionary.student_city return a scope.
128
+ Is there any exist low level method to monitor the change of descendents?
125
129
  Add test code for cache DictType.tab_and_column,then uncomment the cache code.
126
130
  Remove gems/rails_dictionary-0.0.9.4/app/views from rails view path
127
131
 
@@ -1,5 +1,5 @@
1
1
  class Array
2
- # returning a hash,not array
2
+ # Return a hash by compare two arrays
3
3
  def extract_to_hash(keys_array)
4
4
  ret_hash={}
5
5
  keys_array.each {|ky| ret_hash[ky.to_sym]=[]}
@@ -22,17 +22,19 @@ module RailsDictionary
22
22
  belongs_to :dict_type
23
23
  after_save :delete_dicts_cache
24
24
  after_destroy :delete_dicts_cache
25
+ scope :dict_type_name_eq, lambda { |name| joins(:dict_type).where("dict_types.name" => name) }
25
26
 
26
27
  include RailsDictionary::ActsAsDictionary
27
28
  end
28
29
 
30
+ # Ex: acts_as_dict_slave :add => :category
29
31
  # :except - remove dict mapping column
30
32
  # :add - add dict mapping column
31
33
  # :locale - add and initialize class attribute default_dict_locale
32
34
  def acts_as_dict_slave(ops={})
33
35
  include RailsDictionary::ActsAsDictSlave
34
- class_attribute :default_dict_locale,:instance_writer => false
35
- cattr_accessor :dict_mapping_columns,:instance_writes => false
36
+ class_attribute :default_dict_locale, :instance_writer => false
37
+ cattr_accessor :dict_mapping_columns, :instance_writes => false
36
38
  self.default_dict_locale = ops[:locale] if ops[:locale]
37
39
  self.dict_mapping_columns = dict_columns(ops)
38
40
  unless dict_mapping_columns.nil?
@@ -19,9 +19,9 @@ module RailsDictionary
19
19
 
20
20
  # columns which map to dictionary
21
21
  def dict_columns(ops={})
22
- conf={except: nil,add: nil}
22
+ conf = { except: nil, add: nil}
23
23
  conf.update(ops)
24
- cidt=self.columns_in_dict_type || []
24
+ cidt = columns_in_dict_type || []
25
25
  cidt.delete(conf[:except])
26
26
  case conf[:add]
27
27
  when String
@@ -24,24 +24,25 @@ module RailsDictionary
24
24
  end
25
25
  end
26
26
 
27
- # TODO: get a more accurate method name
28
27
  #
29
- # Parse the name value to get which column and model are listed in DictType
28
+ # Parse the name value to get which column and model(or table) are listed in DictType
30
29
  #
31
30
  # Programmer DOC:
32
31
  # There are two chooses to get subclass,one is subclasses the other is descendants,
33
32
  # I don't know which is better,but descendants contains subclass of subclass,it contains more.
33
+ #
34
34
  # Class like +Ckeditor::Asset+ transfer to "ckeditor/asset",but we can not naming method like that,
35
35
  # So it still not support, the solution may be simple,just make another convention to escape "/"
36
+ #
37
+ # Seems this method did not need to be cached in production.
38
+ # Because everyclass was cached before application was run.So after application was run, it never be run again.
36
39
  # TODO:
37
40
  # To cache this method output need more skills on how to caculate ActiveRecord::Base.descendants
38
41
  # Temply remove the cache
39
42
  # And add test for this situation
40
43
  def tab_and_column
41
- #Rails.cache.fetch("DictType.tab_and_column") do
42
- all_model_class=ActiveRecord::Base.descendants.map(&:name).map(&:underscore)
43
- all_types.map(&:to_s).extract_to_hash(all_model_class)
44
- #end
44
+ all_model_class=ActiveRecord::Base.descendants.map(&:name).map(&:underscore)
45
+ all_types.map(&:to_s).extract_to_hash(all_model_class)
45
46
  end
46
47
  end
47
48
 
@@ -49,7 +50,6 @@ module RailsDictionary
49
50
  def delete_all_caches
50
51
  Rails.cache.delete("DictType.all_types")
51
52
  Rails.cache.delete("DictType.cached_all")
52
- #Rails.cache.delete("DictType.tab_and_column")
53
53
  return true
54
54
  end
55
55
  end
@@ -7,16 +7,9 @@ module RailsDictionary
7
7
 
8
8
  module ClassMethods
9
9
 
10
- # Return an instance of array
11
- # Programmer DOC:
12
- # Following design is failed with sqlite3 in test
13
- # scope :dict_type_name_eq,lambda {|method_name| joins(:dict_type).where("dict_types.name" => method_name)}
14
- # remove the all seems not pass test,return following errors
15
- # TypeError: no marshal_dump is defined for class SQLite3::Database
16
- def dict_type_name_eq(method_name)
17
- joins(:dict_type).where("dict_types.name" => method_name).all
18
- end
19
-
10
+ # For rails3
11
+ # I thought it would be better to define a method in method_missing, Not just generate cache.
12
+ # Cause cache can not store ActiveRecord
20
13
  # Generate methods like Dictionary.student_city
21
14
  # Dictionary.student_city - a list of dictionary object which dict type is student_city
22
15
  # Dictionary.student_city(:locale => :zh) - a select format array which can be used
@@ -24,17 +17,17 @@ module RailsDictionary
24
17
  # Programmer DOC && TODO:
25
18
  # rethink about the cache.
26
19
  # cache methods like Dictionary.student_city(:locale => :zh,:sort => :name_fr)
27
- # but not cache Dictionary.student_city,return it as relation
20
+ # but not cache Dictionary.student_city, return it as relation
28
21
  #
29
22
  # Remove nil noise,if listed_attr =[[nil, 201], [nil, 203], [nil, 202], ["Sciences", 200]]
30
23
  # the sort would be failed of ArgumentError: comparison of Array with Array failed
31
24
  # split this method ,make it more short and maintainance
32
25
  def method_missing(method_id,options={})
33
- method_name=method_id.to_s.downcase
34
26
  if DictType.all_types.include? method_id
35
- Rails.cache.fetch("Dictionary.#{method_name}") { dict_type_name_eq(method_name) }
36
- listed_attr=Rails.cache.read("Dictionary.#{method_name}").dup
37
- # Instance of activerelation can not be dup?
27
+ method_name=method_id.to_s.downcase
28
+ Rails.cache.fetch("Dictionary.#{method_name}") { dict_type_name_eq(method_name).all }
29
+ listed_attr=Rails.cache.read("Dictionary.#{method_name}").dup # Instance of ActiveRecord::Relation can not be dup?
30
+ build_scope_method(method_id)
38
31
  if options.keys.include? :locale or options.keys.include? "locale"
39
32
  locale="name_#{ options[:locale] }"
40
33
  sort_block=sort_dicts(options)
@@ -47,7 +40,7 @@ module RailsDictionary
47
40
  end
48
41
  end
49
42
 
50
- # overide this method to get customed sort block
43
+ # Override this method to get customed sort block
51
44
  def sort_dicts(options)
52
45
  if options.keys.include? :locale or options.keys.include? "locale"
53
46
  locale="name_#{ options[:locale] }"
@@ -62,7 +55,18 @@ module RailsDictionary
62
55
  end
63
56
  end
64
57
 
65
- end
58
+ private
59
+
60
+ def build_scope_method(name)
61
+ scope_method_name = "scoped_#{name}".to_sym
62
+ unless respond_to? scope_method_name
63
+ define_singleton_method scope_method_name do
64
+ dict_type_name_eq(name).scoped
65
+ end
66
+ end
67
+ end
68
+
69
+ end # End ClassMethods
66
70
 
67
71
  module InstanceMethods
68
72
  def delete_dicts_cache
@@ -70,6 +74,7 @@ module RailsDictionary
70
74
  Rails.cache.delete("Dictionary.#{method_name}")
71
75
  return true
72
76
  end
73
- end
77
+ end # End InstanceMethods
78
+
74
79
  end
75
80
  end
@@ -1,3 +1,3 @@
1
1
  module RailsDictionary
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -48,12 +48,18 @@ describe RailsDictionary do
48
48
  Dictionary.student_city(:locale => :zh).should == [["北京", 2],["上海",1]]
49
49
  end
50
50
 
51
+ it "build scope method scoped_student_city" do
52
+ Dictionary.scoped_student_city.class.name.should == "ActiveRecord::Relation"
53
+ Dictionary.scoped_student_city.where(:id => 1).should == [dy_shanghai]
54
+ end
55
+
51
56
  it "after record added or removed" do
52
57
  @dy_wuhan=Dictionary.create! name_en: "wuhan",name_zh: "武汉",name_fr: "wuhan",dict_type_id: dt_stu_city.id
53
58
  Dictionary.student_city(:locale => :en).should == [["beijing", 2],["shanghai",1],["wuhan", 3]]
54
59
  @dy_wuhan.destroy
55
60
  Dictionary.student_city(:locale => :en).should == [["beijing", 2],["shanghai",1]]
56
61
  end
62
+
57
63
  end
58
64
 
59
65
  describe Student do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_dictionary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
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: 2011-12-06 00:00:00.000000000Z
12
+ date: 2011-12-28 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &16060860 !ruby/object:Gem::Requirement
16
+ requirement: &11331140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>'
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16060860
24
+ version_requirements: *11331140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &16060200 !ruby/object:Gem::Requirement
27
+ requirement: &11327380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>'
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '3.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *16060200
35
+ version_requirements: *11327380
36
36
  description: Rails plugin for mapping static data of web application to Dictionary
37
37
  class
38
38
  email: