acts_as_eav_model 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.rvmrc +1 -0
  2. data/CHANGELOG +3 -0
  3. data/Gemfile +13 -0
  4. data/Gemfile.lock +92 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +117 -0
  7. data/Rakefile +46 -0
  8. data/SPECDOC +23 -0
  9. data/TODO +0 -0
  10. data/VERSION +1 -0
  11. data/doc/classes/ActiveRecord/Acts/EavModel.html +213 -0
  12. data/doc/classes/ActiveRecord/Acts/EavModel/ClassMethods.html +343 -0
  13. data/doc/classes/ActiveRecord/Acts/EavModel/InstanceMethods.html +474 -0
  14. data/doc/classes/ActiveRecord/Acts/EavModel/InstanceMethods/ClassMethods.html +192 -0
  15. data/doc/classes/ActiveRecord/Base.html +170 -0
  16. data/doc/created.rid +1 -0
  17. data/doc/files/CHANGELOG.html +113 -0
  18. data/doc/files/MIT-LICENSE.html +129 -0
  19. data/doc/files/README_rdoc.html +248 -0
  20. data/doc/files/SPECDOC.html +170 -0
  21. data/doc/files/lib/acts_as_eav_model_rb.html +101 -0
  22. data/doc/fr_class_index.html +31 -0
  23. data/doc/fr_file_index.html +31 -0
  24. data/doc/fr_method_index.html +40 -0
  25. data/doc/index.html +24 -0
  26. data/doc/rdoc-style.css +208 -0
  27. data/init.rb +1 -0
  28. data/install.rb +1 -0
  29. data/lib/acts_as_eav_model.rb +542 -0
  30. data/spec/dummy/Rakefile +7 -0
  31. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  32. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  33. data/spec/dummy/app/models/document.rb +7 -0
  34. data/spec/dummy/app/models/person.rb +13 -0
  35. data/spec/dummy/app/models/person_contact_info.rb +2 -0
  36. data/spec/dummy/app/models/post.rb +4 -0
  37. data/spec/dummy/app/models/post_attribute.rb +2 -0
  38. data/spec/dummy/app/models/preference.rb +5 -0
  39. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  40. data/spec/dummy/config.ru +4 -0
  41. data/spec/dummy/config/application.rb +45 -0
  42. data/spec/dummy/config/boot.rb +10 -0
  43. data/spec/dummy/config/database.yml +22 -0
  44. data/spec/dummy/config/environment.rb +5 -0
  45. data/spec/dummy/config/environments/development.rb +26 -0
  46. data/spec/dummy/config/environments/production.rb +49 -0
  47. data/spec/dummy/config/environments/test.rb +35 -0
  48. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  49. data/spec/dummy/config/initializers/inflections.rb +10 -0
  50. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  51. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  52. data/spec/dummy/config/initializers/session_store.rb +8 -0
  53. data/spec/dummy/config/locales/en.yml +5 -0
  54. data/spec/dummy/config/routes.rb +58 -0
  55. data/spec/dummy/db/development.sqlite3 +0 -0
  56. data/spec/dummy/db/schema.rb +51 -0
  57. data/spec/dummy/public/404.html +26 -0
  58. data/spec/dummy/public/422.html +26 -0
  59. data/spec/dummy/public/500.html +26 -0
  60. data/spec/dummy/public/favicon.ico +0 -0
  61. data/spec/dummy/public/javascripts/application.js +2 -0
  62. data/spec/dummy/public/javascripts/controls.js +965 -0
  63. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  64. data/spec/dummy/public/javascripts/effects.js +1123 -0
  65. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  66. data/spec/dummy/public/javascripts/rails.js +175 -0
  67. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  68. data/spec/dummy/script/rails +6 -0
  69. data/spec/fixtures/people.yml +4 -0
  70. data/spec/fixtures/person_contact_infos.yml +10 -0
  71. data/spec/fixtures/post_attributes.yml +15 -0
  72. data/spec/fixtures/posts.yml +9 -0
  73. data/spec/fixtures/preferences.yml +10 -0
  74. data/spec/models/eav_model_with_no_arguments_spec.rb +82 -0
  75. data/spec/models/eav_model_with_options_spec.rb +37 -0
  76. data/spec/models/eav_validation_spec.rb +11 -0
  77. data/spec/schema.rb +50 -0
  78. data/spec/spec_helper.rb +38 -0
  79. data/uninstall.rb +1 -0
  80. metadata +213 -0
@@ -0,0 +1,343 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: ActiveRecord::Acts::EavModel::ClassMethods</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">ActiveRecord::Acts::EavModel::ClassMethods</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../../files/lib/acts_as_eav_model_rb.html">
59
+ lib/acts_as_eav_model.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ </table>
66
+ </div>
67
+ <!-- banner header -->
68
+
69
+ <div id="bodyContent">
70
+
71
+
72
+
73
+ <div id="contextContent">
74
+
75
+
76
+
77
+ </div>
78
+
79
+ <div id="method-list">
80
+ <h3 class="section-bar">Methods</h3>
81
+
82
+ <div class="name-list">
83
+ <a href="#M000001">has_eav_behavior</a>&nbsp;&nbsp;
84
+ </div>
85
+ </div>
86
+
87
+ </div>
88
+
89
+
90
+ <!-- if includes -->
91
+
92
+ <div id="section">
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+ <!-- if method_list -->
102
+ <div id="methods">
103
+ <h3 class="section-bar">Public Instance methods</h3>
104
+
105
+ <div id="method-M000001" class="method-detail">
106
+ <a name="M000001"></a>
107
+
108
+ <div class="method-heading">
109
+ <a href="#M000001" class="method-signature">
110
+ <span class="method-name">has_eav_behavior</span><span class="method-args">(options = {})</span>
111
+ </a>
112
+ </div>
113
+
114
+ <div class="method-description">
115
+ <p>
116
+ Will make the current class have eav behaviour.
117
+ </p>
118
+ <pre>
119
+ class Post &lt; ActiveRecord::Base
120
+ has_eav_behavior
121
+ end
122
+ post = Post.find_by_title 'hello world'
123
+ puts &quot;My post intro is: #{post.intro}&quot;
124
+ post.teaser = 'An awesome introduction to the blog'
125
+ post.save
126
+ </pre>
127
+ <p>
128
+ The above example should work even though &quot;intro&quot; and
129
+ &quot;teaser&quot; are not attributes on the Post model.
130
+ </p>
131
+ <p>
132
+ The following options are available on for <a
133
+ href="ClassMethods.html#M000001">has_eav_behavior</a> to modify the
134
+ behavior. Reasonable defaults are provided:
135
+ </p>
136
+ <ul>
137
+ <li><tt>class_name</tt>: The class for the related model. This defaults to the
138
+ model name prepended to &quot;Attribute&quot;. So for a &quot;User&quot;
139
+ model the class name would be &quot;UserAttribute&quot;. The class can
140
+ actually exist (in that case the model file will be loaded through Rails
141
+ dependency system) or if it does not exist a basic model will be
142
+ dynamically defined for you. This allows you to implement custom methods on
143
+ the related class by simply defining the class manually.
144
+
145
+ </li>
146
+ <li><tt>table_name</tt>: The table for the related model. This defaults to the
147
+ attribute model&#8216;s table name.
148
+
149
+ </li>
150
+ <li><tt>relationship_name</tt>: This is the name of the actual has_many
151
+ relationship. Most of the type this relationship will only be used
152
+ indirectly but it is there if the user wants more raw access. This defaults
153
+ to the class name underscored then pluralized finally turned into a symbol.
154
+
155
+ </li>
156
+ <li><tt>foreign_key</tt>: The key in the attribute table to relate back to the
157
+ model. This defaults to the model name underscored prepended to
158
+ &quot;_id&quot;
159
+
160
+ </li>
161
+ <li><tt>name_field</tt>: The field which stores the name of the attribute in
162
+ the related object
163
+
164
+ </li>
165
+ <li><tt>value_field</tt>: The field that stores the value in the related object
166
+
167
+ </li>
168
+ <li><tt>fields</tt>: A list of fields that are valid eav attributes. By default
169
+ this is &quot;nil&quot; which means that all field are valid. Use this
170
+ option if you want some fields to go to one flex attribute model while
171
+ other fields will go to another. As an alternative you can override the
172
+ eav_attributes method which will return a list of all valid flex
173
+ attributes. This is useful if you want to read the list of attributes from
174
+ another source to keep your code DRY. This method is given a single
175
+ argument which is the class for the related model. The following provide an
176
+ example:
177
+
178
+ </li>
179
+ </ul>
180
+ <pre>
181
+ class User &lt; ActiveRecord::Base
182
+ has_eav_behavior :class_name =&gt; 'UserContactInfo'
183
+ has_eav_behavior :class_name =&gt; 'Preferences'
184
+
185
+ def eav_attributes(model)
186
+ case model
187
+ when UserContactInfo
188
+ %w(email phone aim yahoo msn)
189
+ when Preference
190
+ %w(project_search project_order user_search user_order)
191
+ else Array.new
192
+ end
193
+ end
194
+ end
195
+
196
+ marcus = User.find_by_login 'marcus'
197
+ marcus.email = 'marcus@example.com' # Will save to UserContactInfo model
198
+ marcus.project_order = 'name' # Will save to Preference
199
+ marcus.save # Carries out save so now values are in database
200
+ </pre>
201
+ <p>
202
+ Note the else clause in our case statement. Since an empty array is
203
+ returned for all other models (perhaps added later) then we can be certain
204
+ that only the above eav attributes are allowed.
205
+ </p>
206
+ <p>
207
+ If both a :fields option and eav_attributes method is defined the
208
+ <tt>fields</tt> option take precidence. This allows you to easily define
209
+ the field list inline for one model while implementing eav_attributes for
210
+ another model and not having eav_attributes need to determine what model it
211
+ is answering for. In both cases the list of flex attributes can be a list
212
+ of string or symbols
213
+ </p>
214
+ <p>
215
+ A final alternative to :fields and eav_attributes is the is_eav_attribute?
216
+ method. This method is given two arguments. The first is the attribute
217
+ being retrieved/saved the second is the Model we are testing for. If you
218
+ override this method then the eav_attributes method or the :fields option
219
+ will have no affect. Use of this method is ideal when you want to retrict
220
+ the attributes but do so in a algorithmic way. The following is an example:
221
+ </p>
222
+ <pre>
223
+ class User &lt; ActiveRecord::Base
224
+ has_eav_behavior :class_name =&gt; 'UserContactInfo'
225
+ has_eav_behavior :class_name =&gt; 'Preferences'
226
+
227
+ def is_eav_attribute?(attr, model)
228
+ case attr.to_s
229
+ when /^contact_/ then true
230
+ when /^preference_/ then true
231
+ else
232
+ false
233
+ end
234
+ end
235
+ end
236
+
237
+ marcus = User.find_by_login 'marcus'
238
+ marcus.contact_phone = '021 654 9876'
239
+ marcus.contact_email = 'marcus@example.com'
240
+ marcus.preference_project_order = 'name'
241
+ marcus.some_attribute = 'blah' # If some_attribute is not defined on
242
+ # the model then method not found is thrown
243
+ </pre>
244
+ <p><a class="source-toggle" href="#"
245
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
246
+ <div class="method-source-code" id="M000001-source">
247
+ <pre>
248
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 200</span>
249
+ 200: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">has_eav_behavior</span>(<span class="ruby-identifier">options</span> = {})
250
+ 201:
251
+ 202: <span class="ruby-comment cmt"># Provide default options</span>
252
+ 203: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>] <span class="ruby-operator">||=</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class_name</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'Attribute'</span>
253
+ 204: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:table_name</span>] <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>].<span class="ruby-identifier">tableize</span>
254
+ 205: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:relationship_name</span>] <span class="ruby-operator">||=</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>].<span class="ruby-identifier">tableize</span>.<span class="ruby-identifier">to_sym</span>
255
+ 206: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:foreign_key</span>] <span class="ruby-operator">||=</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class_name</span>.<span class="ruby-identifier">foreign_key</span>
256
+ 207: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:base_foreign_key</span>] <span class="ruby-operator">||=</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">name</span>.<span class="ruby-identifier">underscore</span>.<span class="ruby-identifier">foreign_key</span>
257
+ 208: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:name_field</span>] <span class="ruby-operator">||=</span> <span class="ruby-value str">'name'</span>
258
+ 209: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:value_field</span>] <span class="ruby-operator">||=</span> <span class="ruby-value str">'value'</span>
259
+ 210: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:fields</span>].<span class="ruby-identifier">collect!</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">to_s</span>} <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:fields</span>].<span class="ruby-identifier">nil?</span>
260
+ 211: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:parent</span>] = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class_name</span>
261
+ 212:
262
+ 213: <span class="ruby-comment cmt"># Init option storage if necessary</span>
263
+ 214: <span class="ruby-identifier">cattr_accessor</span> <span class="ruby-identifier">:eav_options</span>
264
+ 215: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">eav_options</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>
265
+ 216:
266
+ 217: <span class="ruby-comment cmt"># Return if already processed.</span>
267
+ 218: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">eav_options</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>]
268
+ 219:
269
+ 220: <span class="ruby-comment cmt"># Attempt to load related class. If not create it</span>
270
+ 221: <span class="ruby-keyword kw">begin</span>
271
+ 222: <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>].<span class="ruby-identifier">constantize</span>
272
+ 223: <span class="ruby-keyword kw">rescue</span>
273
+ 224: <span class="ruby-constant">Object</span>.<span class="ruby-identifier">const_set</span>(<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>],
274
+ 225: <span class="ruby-constant">Class</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>)).<span class="ruby-identifier">class_eval</span> <span class="ruby-keyword kw">do</span>
275
+ 226: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">reloadable?</span> <span class="ruby-comment cmt">#:nodoc:</span>
276
+ 227: <span class="ruby-keyword kw">false</span>
277
+ 228: <span class="ruby-keyword kw">end</span>
278
+ 229: <span class="ruby-keyword kw">end</span>
279
+ 230: <span class="ruby-keyword kw">end</span>
280
+ 231:
281
+ 232: <span class="ruby-comment cmt"># Store options</span>
282
+ 233: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>]] = <span class="ruby-identifier">options</span>
283
+ 234:
284
+ 235: <span class="ruby-comment cmt"># Only mix instance methods once</span>
285
+ 236: <span class="ruby-keyword kw">unless</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">included_modules</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Acts</span><span class="ruby-operator">::</span><span class="ruby-constant">EavModel</span><span class="ruby-operator">::</span><span class="ruby-constant">InstanceMethods</span>)
286
+ 237: <span class="ruby-identifier">send</span> <span class="ruby-identifier">:include</span>, <span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Acts</span><span class="ruby-operator">::</span><span class="ruby-constant">EavModel</span><span class="ruby-operator">::</span><span class="ruby-constant">InstanceMethods</span>
287
+ 238: <span class="ruby-keyword kw">end</span>
288
+ 239:
289
+ 240: <span class="ruby-comment cmt"># Modify attribute class</span>
290
+ 241: <span class="ruby-identifier">attribute_class</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>].<span class="ruby-identifier">constantize</span>
291
+ 242: <span class="ruby-identifier">base_class</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">name</span>.<span class="ruby-identifier">underscore</span>.<span class="ruby-identifier">to_sym</span>
292
+ 243:
293
+ 244: <span class="ruby-identifier">attribute_class</span>.<span class="ruby-identifier">class_eval</span> <span class="ruby-keyword kw">do</span>
294
+ 245: <span class="ruby-identifier">belongs_to</span> <span class="ruby-identifier">base_class</span>, <span class="ruby-identifier">:foreign_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:base_foreign_key</span>]
295
+ 246: <span class="ruby-identifier">alias_method</span> <span class="ruby-identifier">:base</span>, <span class="ruby-identifier">base_class</span> <span class="ruby-comment cmt"># For generic access</span>
296
+ 247: <span class="ruby-keyword kw">end</span>
297
+ 248:
298
+ 249: <span class="ruby-comment cmt"># Modify main class</span>
299
+ 250: <span class="ruby-identifier">class_eval</span> <span class="ruby-keyword kw">do</span>
300
+ 251: <span class="ruby-identifier">has_many</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:relationship_name</span>],
301
+ 252: <span class="ruby-identifier">:class_name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:class_name</span>],
302
+ 253: <span class="ruby-identifier">:table_name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:table_name</span>],
303
+ 254: <span class="ruby-identifier">:foreign_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:foreign_key</span>],
304
+ 255: <span class="ruby-identifier">:dependent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:destroy</span>
305
+ 256:
306
+ 257: <span class="ruby-comment cmt"># The following is only setup once</span>
307
+ 258: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">method_defined?</span> <span class="ruby-identifier">:method_missing_without_eav_behavior</span>
308
+ 259:
309
+ 260: <span class="ruby-comment cmt"># Carry out delayed actions before save</span>
310
+ 261: <span class="ruby-identifier">after_validation_on_update</span> <span class="ruby-identifier">:save_modified_eav_attributes</span>
311
+ 262:
312
+ 263: <span class="ruby-comment cmt"># Make attributes seem real</span>
313
+ 264: <span class="ruby-identifier">alias_method_chain</span> <span class="ruby-identifier">:method_missing</span>, <span class="ruby-identifier">:eav_behavior</span>
314
+ 265:
315
+ 266: <span class="ruby-identifier">private</span>
316
+ 267:
317
+ 268: <span class="ruby-identifier">alias_method_chain</span> <span class="ruby-identifier">:read_attribute</span>, <span class="ruby-identifier">:eav_behavior</span>
318
+ 269: <span class="ruby-identifier">alias_method_chain</span> <span class="ruby-identifier">:write_attribute</span>, <span class="ruby-identifier">:eav_behavior</span>
319
+ 270:
320
+ 271: <span class="ruby-keyword kw">end</span>
321
+ 272: <span class="ruby-keyword kw">end</span>
322
+ 273:
323
+ 274: <span class="ruby-identifier">create_attribute_table</span>
324
+ 275:
325
+ 276: <span class="ruby-keyword kw">end</span>
326
+ </pre>
327
+ </div>
328
+ </div>
329
+ </div>
330
+
331
+
332
+ </div>
333
+
334
+
335
+ </div>
336
+
337
+
338
+ <div id="validator-badges">
339
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
340
+ </div>
341
+
342
+ </body>
343
+ </html>
@@ -0,0 +1,474 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: ActiveRecord::Acts::EavModel::InstanceMethods</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">ActiveRecord::Acts::EavModel::InstanceMethods</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../../../files/lib/acts_as_eav_model_rb.html">
59
+ lib/acts_as_eav_model.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ </table>
66
+ </div>
67
+ <!-- banner header -->
68
+
69
+ <div id="bodyContent">
70
+
71
+
72
+
73
+ <div id="contextContent">
74
+
75
+
76
+
77
+ </div>
78
+
79
+ <div id="method-list">
80
+ <h3 class="section-bar">Methods</h3>
81
+
82
+ <div class="name-list">
83
+ <a href="#M000011">each_eav_relation</a>&nbsp;&nbsp;
84
+ <a href="#M000003">eav_attributes</a>&nbsp;&nbsp;
85
+ <a href="#M000009">eav_related</a>&nbsp;&nbsp;
86
+ <a href="#M000010">exec_if_related</a>&nbsp;&nbsp;
87
+ <a href="#M000008">find_related_eav_attribute</a>&nbsp;&nbsp;
88
+ <a href="#M000002">is_eav_attribute?</a>&nbsp;&nbsp;
89
+ <a href="#M000007">method_missing_with_eav_behavior</a>&nbsp;&nbsp;
90
+ <a href="#M000005">read_attribute_with_eav_behavior</a>&nbsp;&nbsp;
91
+ <a href="#M000004">save_modified_eav_attributes</a>&nbsp;&nbsp;
92
+ <a href="#M000006">write_attribute_with_eav_behavior</a>&nbsp;&nbsp;
93
+ </div>
94
+ </div>
95
+
96
+ </div>
97
+
98
+
99
+ <!-- if includes -->
100
+
101
+ <div id="section">
102
+
103
+ <div id="class-list">
104
+ <h3 class="section-bar">Classes and Modules</h3>
105
+
106
+ Module <a href="InstanceMethods/ClassMethods.html" class="link">ActiveRecord::Acts::EavModel::InstanceMethods::ClassMethods</a><br />
107
+
108
+ </div>
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+ <!-- if method_list -->
117
+ <div id="methods">
118
+ <h3 class="section-bar">Public Instance methods</h3>
119
+
120
+ <div id="method-M000003" class="method-detail">
121
+ <a name="M000003"></a>
122
+
123
+ <div class="method-heading">
124
+ <a href="#M000003" class="method-signature">
125
+ <span class="method-name">eav_attributes</span><span class="method-args">(model)</span>
126
+ </a>
127
+ </div>
128
+
129
+ <div class="method-description">
130
+ <p>
131
+ Return a list of valid eav attributes for the given model. Return nil if
132
+ any field is allowed. If you want to say no field is allowed then return an
133
+ empty array. If you just have a static list the :fields option is most
134
+ likely easier.
135
+ </p>
136
+ <p><a class="source-toggle" href="#"
137
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
138
+ <div class="method-source-code" id="M000003-source">
139
+ <pre>
140
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 347</span>
141
+ 347: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">eav_attributes</span>(<span class="ruby-identifier">model</span>); <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">end</span>
142
+ </pre>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <div id="method-M000002" class="method-detail">
148
+ <a name="M000002"></a>
149
+
150
+ <div class="method-heading">
151
+ <a href="#M000002" class="method-signature">
152
+ <span class="method-name">is_eav_attribute?</span><span class="method-args">(attribute_name, model)</span>
153
+ </a>
154
+ </div>
155
+
156
+ <div class="method-description">
157
+ <p>
158
+ Will determine if the given attribute is a eav attribute on the given
159
+ model. Override this in your class to provide custom logic if the <a
160
+ href="InstanceMethods.html#M000003">eav_attributes</a> method or the
161
+ :fields option are not flexible enough. If you override this method :fields
162
+ and <a href="InstanceMethods.html#M000003">eav_attributes</a> will not
163
+ apply at all unless you implement them yourself.
164
+ </p>
165
+ <p><a class="source-toggle" href="#"
166
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
167
+ <div class="method-source-code" id="M000002-source">
168
+ <pre>
169
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 332</span>
170
+ 332: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">is_eav_attribute?</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">model</span>)
171
+ 333: <span class="ruby-identifier">attribute_name</span> = <span class="ruby-identifier">attribute_name</span>.<span class="ruby-identifier">to_s</span>
172
+ 334: <span class="ruby-identifier">model_options</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>]
173
+ 335: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">model_options</span>[<span class="ruby-identifier">:fields</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">attribute_name</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">model_options</span>[<span class="ruby-identifier">:fields</span>].<span class="ruby-identifier">nil?</span>
174
+ 336: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">eav_attributes</span>(<span class="ruby-identifier">model</span>).<span class="ruby-identifier">collect</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">field</span><span class="ruby-operator">|</span> <span class="ruby-identifier">field</span>.<span class="ruby-identifier">to_s</span>}.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">attribute_name</span>) <span class="ruby-keyword kw">unless</span>
175
+ 337: <span class="ruby-identifier">eav_attributes</span>(<span class="ruby-identifier">model</span>).<span class="ruby-identifier">nil?</span>
176
+ 338: <span class="ruby-keyword kw">true</span>
177
+ 339: <span class="ruby-keyword kw">end</span>
178
+ </pre>
179
+ </div>
180
+ </div>
181
+ </div>
182
+
183
+ <h3 class="section-bar">Private Instance methods</h3>
184
+
185
+ <div id="method-M000011" class="method-detail">
186
+ <a name="M000011"></a>
187
+
188
+ <div class="method-heading">
189
+ <a href="#M000011" class="method-signature">
190
+ <span class="method-name">each_eav_relation</span><span class="method-args">() {|kls.constantize| ...}</span>
191
+ </a>
192
+ </div>
193
+
194
+ <div class="method-description">
195
+ <p>
196
+ yields for each eav relation.
197
+ </p>
198
+ <p><a class="source-toggle" href="#"
199
+ onclick="toggleCode('M000011-source');return false;">[Source]</a></p>
200
+ <div class="method-source-code" id="M000011-source">
201
+ <pre>
202
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 473</span>
203
+ 473: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">each_eav_relation</span>
204
+ 474: <span class="ruby-identifier">eav_options</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">kls</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">kls</span>.<span class="ruby-identifier">constantize</span>}
205
+ 475: <span class="ruby-keyword kw">end</span>
206
+ </pre>
207
+ </div>
208
+ </div>
209
+ </div>
210
+
211
+ <div id="method-M000009" class="method-detail">
212
+ <a name="M000009"></a>
213
+
214
+ <div class="method-heading">
215
+ <a href="#M000009" class="method-signature">
216
+ <span class="method-name">eav_related</span><span class="method-args">(model)</span>
217
+ </a>
218
+ </div>
219
+
220
+ <div class="method-description">
221
+ <p>
222
+ Retrieve the collection of related eav attributes
223
+ </p>
224
+ <p><a class="source-toggle" href="#"
225
+ onclick="toggleCode('M000009-source');return false;">[Source]</a></p>
226
+ <div class="method-source-code" id="M000009-source">
227
+ <pre>
228
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 453</span>
229
+ 453: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">eav_related</span>(<span class="ruby-identifier">model</span>)
230
+ 454: <span class="ruby-identifier">relationship</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:relationship_name</span>]
231
+ 455: <span class="ruby-identifier">send</span> <span class="ruby-identifier">relationship</span>
232
+ 456: <span class="ruby-keyword kw">end</span>
233
+ </pre>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <div id="method-M000010" class="method-detail">
239
+ <a name="M000010"></a>
240
+
241
+ <div class="method-heading">
242
+ <a href="#M000010" class="method-signature">
243
+ <span class="method-name">exec_if_related</span><span class="method-args">(attribute_name) {|model| ...}</span>
244
+ </a>
245
+ </div>
246
+
247
+ <div class="method-description">
248
+ <p>
249
+ yield only if attribute_name is a eav_attribute
250
+ </p>
251
+ <p><a class="source-toggle" href="#"
252
+ onclick="toggleCode('M000010-source');return false;">[Source]</a></p>
253
+ <div class="method-source-code" id="M000010-source">
254
+ <pre>
255
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 461</span>
256
+ 461: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">exec_if_related</span>(<span class="ruby-identifier">attribute_name</span>)
257
+ 462: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">column_names</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">attribute_name</span>)
258
+ 463: <span class="ruby-identifier">each_eav_relation</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">model</span><span class="ruby-operator">|</span>
259
+ 464: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">is_eav_attribute?</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">model</span>)
260
+ 465: <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">model</span>
261
+ 466: <span class="ruby-keyword kw">end</span>
262
+ 467: <span class="ruby-keyword kw">end</span>
263
+ 468: <span class="ruby-keyword kw">end</span>
264
+ </pre>
265
+ </div>
266
+ </div>
267
+ </div>
268
+
269
+ <div id="method-M000008" class="method-detail">
270
+ <a name="M000008"></a>
271
+
272
+ <div class="method-heading">
273
+ <a href="#M000008" class="method-signature">
274
+ <span class="method-name">find_related_eav_attribute</span><span class="method-args">(model, attribute_name)</span>
275
+ </a>
276
+ </div>
277
+
278
+ <div class="method-description">
279
+ <p>
280
+ Retrieve the related eav attribute object
281
+ </p>
282
+ <p><a class="source-toggle" href="#"
283
+ onclick="toggleCode('M000008-source');return false;">[Source]</a></p>
284
+ <div class="method-source-code" id="M000008-source">
285
+ <pre>
286
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 443</span>
287
+ 443: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_related_eav_attribute</span>(<span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span>)
288
+ 444: <span class="ruby-identifier">name_field</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:name_field</span>]
289
+ 445: <span class="ruby-identifier">eav_related</span>(<span class="ruby-identifier">model</span>).<span class="ruby-identifier">to_a</span>.<span class="ruby-identifier">find</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">relation</span><span class="ruby-operator">|</span>
290
+ 446: <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">name_field</span>) <span class="ruby-operator">==</span> <span class="ruby-identifier">attribute_name</span>
291
+ 447: <span class="ruby-keyword kw">end</span>
292
+ 448: <span class="ruby-keyword kw">end</span>
293
+ </pre>
294
+ </div>
295
+ </div>
296
+ </div>
297
+
298
+ <div id="method-M000007" class="method-detail">
299
+ <a name="M000007"></a>
300
+
301
+ <div class="method-heading">
302
+ <a href="#M000007" class="method-signature">
303
+ <span class="method-name">method_missing_with_eav_behavior</span><span class="method-args">(method_id, *args, &amp;block)</span>
304
+ </a>
305
+ </div>
306
+
307
+ <div class="method-description">
308
+ <p>
309
+ Implements eav-attributes as if real getter/setter methods were defined.
310
+ </p>
311
+ <p><a class="source-toggle" href="#"
312
+ onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
313
+ <div class="method-source-code" id="M000007-source">
314
+ <pre>
315
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 424</span>
316
+ 424: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing_with_eav_behavior</span>(<span class="ruby-identifier">method_id</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
317
+ 425: <span class="ruby-keyword kw">begin</span>
318
+ 426: <span class="ruby-identifier">method_missing_without_eav_behavior</span>(<span class="ruby-identifier">method_id</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
319
+ 427: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">NoMethodError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
320
+ 428: <span class="ruby-identifier">attribute_name</span> = <span class="ruby-identifier">method_id</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/\=$/</span>, <span class="ruby-value str">''</span>)
321
+ 429: <span class="ruby-identifier">exec_if_related</span>(<span class="ruby-identifier">attribute_name</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">model</span><span class="ruby-operator">|</span>
322
+ 430: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">method_id</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/\=$/</span>
323
+ 431: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">write_attribute_with_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">args</span>[<span class="ruby-value">0</span>])
324
+ 432: <span class="ruby-keyword kw">else</span>
325
+ 433: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">read_attribute_with_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>)
326
+ 434: <span class="ruby-keyword kw">end</span>
327
+ 435: <span class="ruby-keyword kw">end</span>
328
+ 436: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
329
+ 437: <span class="ruby-keyword kw">end</span>
330
+ 438: <span class="ruby-keyword kw">end</span>
331
+ </pre>
332
+ </div>
333
+ </div>
334
+ </div>
335
+
336
+ <div id="method-M000005" class="method-detail">
337
+ <a name="M000005"></a>
338
+
339
+ <div class="method-heading">
340
+ <a href="#M000005" class="method-signature">
341
+ <span class="method-name">read_attribute_with_eav_behavior</span><span class="method-args">(attribute_name)</span>
342
+ </a>
343
+ </div>
344
+
345
+ <div class="method-description">
346
+ <p>
347
+ Overrides ActiveRecord::Base#read_attribute
348
+ </p>
349
+ <p><a class="source-toggle" href="#"
350
+ onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
351
+ <div class="method-source-code" id="M000005-source">
352
+ <pre>
353
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 375</span>
354
+ 375: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">read_attribute_with_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>)
355
+ 376: <span class="ruby-identifier">attribute_name</span> = <span class="ruby-identifier">attribute_name</span>.<span class="ruby-identifier">to_s</span>
356
+ 377: <span class="ruby-identifier">exec_if_related</span>(<span class="ruby-identifier">attribute_name</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">model</span><span class="ruby-operator">|</span>
357
+ 378: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@remove_eav_attr</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@remove_eav_attr</span>.<span class="ruby-identifier">any?</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
358
+ 379: <span class="ruby-identifier">r</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">model</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">r</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">attribute_name</span>
359
+ 380: <span class="ruby-keyword kw">end</span>
360
+ 381:
361
+ 382: <span class="ruby-identifier">value_field</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:value_field</span>]
362
+ 383: <span class="ruby-identifier">related_attribute</span> = <span class="ruby-identifier">find_related_eav_attribute</span>(<span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span>)
363
+ 384:
364
+ 385: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">nil?</span>
365
+ 386: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">value_field</span>)
366
+ 387: <span class="ruby-keyword kw">end</span>
367
+ 388: <span class="ruby-identifier">read_attribute_without_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>)
368
+ 389: <span class="ruby-keyword kw">end</span>
369
+ </pre>
370
+ </div>
371
+ </div>
372
+ </div>
373
+
374
+ <div id="method-M000004" class="method-detail">
375
+ <a name="M000004"></a>
376
+
377
+ <div class="method-heading">
378
+ <a href="#M000004" class="method-signature">
379
+ <span class="method-name">save_modified_eav_attributes</span><span class="method-args">()</span>
380
+ </a>
381
+ </div>
382
+
383
+ <div class="method-description">
384
+ <p>
385
+ Called after validation on update so that eav attributes behave like normal
386
+ attributes in the fact that the database is not touched until save is
387
+ called.
388
+ </p>
389
+ <p><a class="source-toggle" href="#"
390
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
391
+ <div class="method-source-code" id="M000004-source">
392
+ <pre>
393
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 356</span>
394
+ 356: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">save_modified_eav_attributes</span>
395
+ 357: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@save_eav_attr</span>.<span class="ruby-identifier">nil?</span>
396
+ 358: <span class="ruby-ivar">@save_eav_attr</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span>
397
+ 359: <span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span> = <span class="ruby-identifier">s</span>
398
+ 360: <span class="ruby-identifier">related_attribute</span> = <span class="ruby-identifier">find_related_eav_attribute</span>(<span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span>)
399
+ 361: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">nil?</span>
400
+ 362: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">value</span>.<span class="ruby-identifier">nil?</span>
401
+ 363: <span class="ruby-identifier">eav_related</span>(<span class="ruby-identifier">model</span>).<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">related_attribute</span>)
402
+ 364: <span class="ruby-keyword kw">else</span>
403
+ 365: <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">save</span>
404
+ 366: <span class="ruby-keyword kw">end</span>
405
+ 367: <span class="ruby-keyword kw">end</span>
406
+ 368: <span class="ruby-keyword kw">end</span>
407
+ 369: <span class="ruby-ivar">@save_eav_attr</span> = []
408
+ 370: <span class="ruby-keyword kw">end</span>
409
+ </pre>
410
+ </div>
411
+ </div>
412
+ </div>
413
+
414
+ <div id="method-M000006" class="method-detail">
415
+ <a name="M000006"></a>
416
+
417
+ <div class="method-heading">
418
+ <a href="#M000006" class="method-signature">
419
+ <span class="method-name">write_attribute_with_eav_behavior</span><span class="method-args">(attribute_name, value)</span>
420
+ </a>
421
+ </div>
422
+
423
+ <div class="method-description">
424
+ <p>
425
+ Overrides ActiveRecord::Base#write_attribute
426
+ </p>
427
+ <p><a class="source-toggle" href="#"
428
+ onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
429
+ <div class="method-source-code" id="M000006-source">
430
+ <pre>
431
+ <span class="ruby-comment cmt"># File lib/acts_as_eav_model.rb, line 394</span>
432
+ 394: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">write_attribute_with_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">value</span>)
433
+ 395: <span class="ruby-identifier">attribute_name</span> = <span class="ruby-identifier">attribute_name</span>.<span class="ruby-identifier">to_s</span>
434
+ 396: <span class="ruby-identifier">exec_if_related</span>(<span class="ruby-identifier">attribute_name</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">model</span><span class="ruby-operator">|</span>
435
+ 397: <span class="ruby-identifier">value_field</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:value_field</span>]
436
+ 398: <span class="ruby-ivar">@save_eav_attr</span> <span class="ruby-operator">||=</span> []
437
+ 399: <span class="ruby-ivar">@save_eav_attr</span> <span class="ruby-operator">&lt;&lt;</span> [<span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span>]
438
+ 400: <span class="ruby-identifier">related_attribute</span> = <span class="ruby-identifier">find_related_eav_attribute</span>(<span class="ruby-identifier">model</span>, <span class="ruby-identifier">attribute_name</span>)
439
+ 401: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">nil?</span>
440
+ 402: <span class="ruby-comment cmt"># Used to check for nil? but this caused validation</span>
441
+ 403: <span class="ruby-comment cmt"># problems that are harder to solve. blank? is probably</span>
442
+ 404: <span class="ruby-comment cmt"># not correct but it works well for now.</span>
443
+ 405: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">blank?</span>
444
+ 406: <span class="ruby-identifier">name_field</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:name_field</span>]
445
+ 407: <span class="ruby-identifier">foreign_key</span> = <span class="ruby-identifier">eav_options</span>[<span class="ruby-identifier">model</span>.<span class="ruby-identifier">name</span>][<span class="ruby-identifier">:foreign_key</span>]
446
+ 408: <span class="ruby-identifier">eav_related</span>(<span class="ruby-identifier">model</span>).<span class="ruby-identifier">build</span> <span class="ruby-identifier">name_field</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">attribute_name</span>,
447
+ 409: <span class="ruby-identifier">value_field</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">value</span>, <span class="ruby-identifier">foreign_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">id</span>
448
+ 410: <span class="ruby-keyword kw">end</span>
449
+ 411: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">value</span>
450
+ 412: <span class="ruby-keyword kw">else</span>
451
+ 413: <span class="ruby-identifier">value_field</span> = (<span class="ruby-identifier">value_field</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'='</span>).<span class="ruby-identifier">to_sym</span>
452
+ 414: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">related_attribute</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">value_field</span>, <span class="ruby-identifier">value</span>)
453
+ 415: <span class="ruby-keyword kw">end</span>
454
+ 416: <span class="ruby-keyword kw">end</span>
455
+ 417: <span class="ruby-identifier">write_attribute_without_eav_behavior</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">value</span>)
456
+ 418: <span class="ruby-keyword kw">end</span>
457
+ </pre>
458
+ </div>
459
+ </div>
460
+ </div>
461
+
462
+
463
+ </div>
464
+
465
+
466
+ </div>
467
+
468
+
469
+ <div id="validator-badges">
470
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
471
+ </div>
472
+
473
+ </body>
474
+ </html>