Commit c32bea850ca229f4d2b658872dc60f92fc4bfc09

Authored by ikeqiao
1 parent 86cf5eaa
Exists in master

add type_scoped to all fields

lib/app/models/magic_field_relationship.rb
... ... @@ -2,13 +2,14 @@ class MagicFieldRelationship < ActiveRecord::Base
2 2 belongs_to :magic_field
3 3 belongs_to :owner, :polymorphic => true
4 4 #belongs_to :extended_model, :polymorphic => true
5   -
6   - validates_uniqueness_of :name, scope: [:owner_id, :owner_type]
  5 + validates_uniqueness_of :name, scope: [:owner_id, :owner_type, :type_scoped]
  6 + validates_presence_of :name, :type_scoped
7 7  
8 8 before_validation :sync_name
9 9  
10 10 def sync_name
11 11 self.name = magic_field.name
  12 + self.type_scoped = magic_field.type_scoped.blank? ? self.owner_type : magic_field.type_scoped
12 13 end
13 14  
14 15 end
... ...
lib/generators/has_magic_fields/install/templates/migration.rb
... ... @@ -8,6 +8,7 @@ class AddHasMagicFieldsTables < ActiveRecord::Migration
8 8 t.column :is_required, :boolean, :default => false
9 9 t.column :include_blank, :boolean, :default => false
10 10 t.column :allow_other, :boolean, :default => true
  11 + t.column :type_scoped, :string
11 12 t.column :created_at, :datetime
12 13 t.column :updated_at, :datetime
13 14 end
... ... @@ -25,6 +26,7 @@ class AddHasMagicFieldsTables < ActiveRecord::Migration
25 26 t.column :owner_id, :integer
26 27 t.column :owner_type, :string
27 28 t.column :name, :string
  29 + t.column :type_scoped, :string
28 30 t.column :created_at, :datetime
29 31 t.column :updated_at, :datetime
30 32 end
... ... @@ -39,7 +41,7 @@ class AddHasMagicFieldsTables < ActiveRecord::Migration
39 41  
40 42 add_index :magic_attribute_relationships, [:magic_attribute_id, :owner_id, :owner_type], name:"magic_attribute_id_owner", :unique => true
41 43 add_index :magic_field_relationships, [:magic_field_id, :owner_id, :owner_type], name:"magic_field_id_owner", :unique => true
42   - add_index :magic_field_relationships, [:name, :owner_id, :owner_type], name:"magic_field_name_owner", :unique => true
  44 + add_index :magic_field_relationships, [:name, :type_scoped, :owner_id, :owner_type], name:"magic_field_name_owner", :unique => true
43 45 end
44 46  
45 47 end
46 48 \ No newline at end of file
... ...
lib/has_magic_fields/extend.rb
... ... @@ -13,6 +13,7 @@ module HasMagicFields
13 13 # Inheritence
14 14 cattr_accessor :inherited_from
15 15  
  16 +
16 17 # if options[:through] is supplied, treat as an inherited relationship
17 18 if self.inherited_from = options[:through]
18 19 class_eval do
... ... @@ -27,12 +28,23 @@ module HasMagicFields
27 28 else
28 29 has_many :magic_field_relationships, :as => :owner, :dependent => :destroy
29 30 has_many :magic_fields, :through => :magic_field_relationships, :dependent => :destroy
  31 + # alias_method_chain :magic_fields, :scoped
30 32 end
31   -
  33 + alias_method :magic_fields_without_scoped, :magic_fields
32 34 end
  35 +
33 36 end
34 37  
35 38 included do
  39 +
  40 + def create_magic_filed(options = {})
  41 + type_scoped = options[:type_scoped].blank? ? self.class.name : options[:type_scoped].classify
  42 + self.magic_fields.create options.merge(type_scoped: type_scoped )
  43 + end
  44 +
  45 + def magic_fields_with_scoped
  46 + magic_fields_without_scoped.where(type_scoped: self.class.name)
  47 + end
36 48  
37 49 def method_missing(method_id, *args)
38 50 super(method_id, *args)
... ...
spec/has_magic_fields/magic_fileds_spec.rb
... ... @@ -19,22 +19,22 @@ describe HasMagicFields do
19 19 end
20 20  
21 21 it "allows adding a magic field" do
22   - @charlie.magic_fields.create(:name => 'salary')
23   - expect(@charlie.magic_fields.length).to be(1)
  22 + @charlie.create_magic_filed(:name => 'salary')
  23 + expect(@charlie.magic_fields.length).to eq(1)
24 24 end
25 25  
26 26 it "validates_uniqueness_of name in a object" do
27   - @charlie.magic_fields.create(:name => 'salary')
  27 + @charlie.create_magic_filed(:name => 'salary')
28 28 before_fields_count = MagicField.count
29   - expect(@charlie.magic_fields.length).to be(1)
30   - expect(lambda{@charlie.magic_fields.create(:name => 'salary')}).to raise_error
31   - expect(@charlie.magic_fields.length).to be(1)
  29 + expect(@charlie.magic_fields.length).to eq(1)
  30 + expect(lambda{@charlie.create_magic_filed(:name => 'salary')}).to raise_error
  31 + expect(@charlie.magic_fields.length).to eq(1)
32 32 after_fields_count = MagicField.count
33 33 expect(before_fields_count).to eq(after_fields_count)
34 34 end
35 35  
36 36 it "allows setting and saving of magic attributes" do
37   - @charlie.magic_fields.create(:name => 'salary')
  37 + @charlie.create_magic_filed(:name => 'salary')
38 38 @charlie.salary = 50000
39 39 @charlie.save
40 40 @charlie = Person.find(@charlie.id)
... ... @@ -42,43 +42,43 @@ describe HasMagicFields do
42 42 end
43 43  
44 44 it "forces required if is_required is true" do
45   - @charlie.magic_fields.create(:name => "last_name", :is_required => true)
  45 + @charlie.create_magic_filed(:name => "last_name", :is_required => true)
46 46 expect(@charlie.save).to be(false)
47 47 @charlie.last_name = "zongsi"
48 48 expect(@charlie.save).to be(true)
49 49 end
50 50  
51 51 it "allows datatype to be :date" do
52   - @charlie.magic_fields.create(:name => "birthday", :datatype => :date)
  52 + @charlie.create_magic_filed(:name => "birthday", :datatype => :date)
53 53 @charlie.birthday = Date.today
54 54 expect(@charlie.save).to be(true)
55 55 end
56 56  
57 57 it "allows datatype to be :datetime" do
58   - @charlie.magic_fields.create(:name => "signed_up_at", :datatype => :datetime)
  58 + @charlie.create_magic_filed(:name => "signed_up_at", :datatype => :datetime)
59 59 @charlie.signed_up_at = DateTime.now
60 60 expect(@charlie.save).to be(true)
61 61 end
62 62  
63 63 it "allows datatype to be :integer" do
64   - @charlie.magic_fields.create(:name => "age", :datatype => :integer)
  64 + @charlie.create_magic_filed(:name => "age", :datatype => :integer)
65 65 @charlie.age = 5
66 66 expect(@charlie.save).to be(true)
67 67 end
68 68  
69 69 it "allows datatype to be :check_box_boolean" do
70   - @charlie.magic_fields.create(:name => "retired", :datatype => :check_box_boolean)
  70 + @charlie.create_magic_filed(:name => "retired", :datatype => :check_box_boolean)
71 71 @charlie.retired = false
72 72 expect(@charlie.save).to be(true)
73 73 end
74 74  
75 75 it "allows default to be set" do
76   - @charlie.magic_fields.create(:name => "bonus", :default => "40000")
  76 + @charlie.create_magic_filed(:name => "bonus", :default => "40000")
77 77 expect(@charlie.bonus).to eq("40000")
78 78 end
79 79  
80 80 it "allows a pretty display name to be set" do
81   - @charlie.magic_fields.create(:name => "zip", :pretty_name => "Zip Code")
  81 + @charlie.create_magic_filed(:name => "zip", :pretty_name => "Zip Code")
82 82 expect(@charlie.magic_fields.last.pretty_name).to eq("Zip Code")
83 83 end
84 84 end
... ... @@ -107,19 +107,21 @@ describe HasMagicFields do
107 107 end
108 108  
109 109 it "allows adding a magic field to the child" do
110   - @alice.magic_fields.create(:name => 'salary')
  110 + @alice.create_magic_filed(:name => 'salary')
  111 + expect(@alice.magic_fields.length).to eq(1)
111 112 expect(lambda{@alice.salary}).not_to raise_error
  113 +
112 114 expect(lambda{@account.salary}).not_to raise_error
113 115 end
114 116  
115 117 it "allows adding a magic field to the parent" do
116   - @account.magic_fields.create(:name => 'age')
  118 + @account.create_magic_filed(:name => 'age')
117 119 expect(lambda{@alice.age}).not_to raise_error
118 120 end
119 121  
120 122 it "sets magic fields for all child models" do
121 123 @bob = User.create(name:"bob", account: @account )
122   - @bob.magic_fields.create(:name => 'birthday')
  124 + @bob.create_magic_filed(:name => 'birthday')
123 125 expect(lambda{@alice.birthday}).not_to raise_error
124 126 @bob.birthday = "2014-07-29"
125 127 expect(@bob.save).to be(true)
... ... @@ -132,22 +134,18 @@ describe HasMagicFields do
132 134  
133 135  
134 136 it "validates_uniqueness_of name in all models object" do
135   - @alice.magic_fields.create(:name => 'salary')
  137 + @alice.create_magic_filed(:name => 'salary')
136 138 before_fields_count = MagicField.count
137   - expect(@alice.magic_fields.length).to be(1)
138   - expect(lambda{@alice.magic_fields.create(:name => 'salary')}).to raise_error
139   - expect(@alice.magic_fields.length).to be(1)
140   - expect(before_fields_count).to eq(MagicField.count)
141   -
142   - expect(lambda{@account.magic_fields.create(:name => 'salary')}).to raise_error
  139 + expect(@alice.magic_fields.length).to eq(1)
  140 + expect(lambda{@alice.create_magic_filed(:name => 'salary')}).to raise_error
  141 + expect(@alice.magic_fields.length).to eq(1)
143 142 expect(before_fields_count).to eq(MagicField.count)
144 143  
145 144 @bob = User.create(name:"bob", account: @account )
146   - expect(lambda{@bob.magic_fields.create(:name => 'salary')}).to raise_error
147   - expect(before_fields_count).to eq(MagicField.count)
148   -
149   - # expect(lambda{@sample.magic_fields.create(:name => 'salary')}).not_to raise_error
150   - # expect(before_fields_count).to eq(MagicField.count - 1)
  145 + expect(lambda{@bob.create_magic_filed(:name => 'salary')}).to raise_error
  146 + expect(lambda{@sample.create_magic_filed(:name => 'salary')}).not_to raise_error
  147 + expect(lambda{@account.create_magic_filed(:name => 'salary')}).not_to raise_error
  148 +
151 149 end
152 150 end
153 151 end
... ...