Class: ActiveObject::Base
Constant Summary collapse
- @@configurations =
nil
- @@database_model =
nil
- @@connection =
nil
Class Method Summary collapse
-
.attribute(*options) ⇒ Object
定义需要持久化的属性 示例: class User < ActiveObject::Base attribute :email,:name,:password # 表示email,name,password需要持久化存储 end.
- .attributes ⇒ Object
-
.base_class ⇒ Object
def delete(id) end.
- .configurations ⇒ Object
-
.configure(model, config) ⇒ Object
配置ActiveObject访问的后台数据库支撑,目前支持LightCloud/TokyoTyrant/TokyoCabinet。 参数
model
用于描述后台数据库的类型。 :TC => 表示TokyoCabinet :TT => 表示TokyoTyrant :LC => 表示LightCloud. -
.create(attributes = nil, &block) ⇒ Object
新建对象(或多个对象)并保存到数据库(假设都通过验证) 不管是否保存到数据库,都将返回对象.
-
.database_model ⇒ Object
返回当前所使用的数据库模型 :TC表示采用的是TokyoCabinet :TT表示采用的是TokyoTyrant :LC表示采用的是LightCloud.
- .deserialize_attributes(raw_record) ⇒ Object
-
.destroy(id) ⇒ Object
删除主关键字与参数
id
匹配的对象,并且在删除之前执行所有的回调和过滤。. -
.find(id) ⇒ Object
通过主关键字查找对象.
-
.id_to_key(id) ⇒ Object
通过id转换成存取用的key.
-
.key_to_id(key) ⇒ Object
将key转换成id.
- .primary_key(value = nil) ⇒ Object
-
.self_and_descendents_from_active_object ⇒ Object
nodoc:.
- .serialize_attributes(record) ⇒ Object
Instance Method Summary collapse
- #attributes ⇒ Object
-
#delete ⇒ Object
从数据库中删除对象 不像 #destroy, 这个方法不运行
before_delete
和after_delete
回调. - #destroy ⇒ Object
-
#destroyed? ⇒ Boolean
如果对象已经被删除,返回true,否则返回false。.
- #id ⇒ Object
-
#id=(value) ⇒ Object
id用来标识对象 为了能够通过前缀访问对象,在uuid之前加入对象的类名作为存取的key.
-
#initialize(attributes = {}) ⇒ Base
constructor
A new instance of Base.
-
#new_record? ⇒ Boolean
如果对象没有被存储,表明对象还是新记录,返回true,否则返回false.
-
#reload ⇒ Object
从数据库中重新加载对象的属性.
-
#save ⇒ Object
:call-seq: save(perform_validation = true).
-
#save! ⇒ Object
执行
save!
时,验证总是被运行。只要有任意一个执行失败都将抛出 ActiveObject::ObjectInvalid异常。. -
#update_attributes(options = {}) ⇒ Object
更新对象属性
options
是需要更新的一组Hash.
Constructor Details
#initialize(attributes = {}) ⇒ Base
Returns a new instance of Base.
291 292 293 294 295 296 297 |
# File 'lib/active_object/base.rb', line 291 def initialize(attributes = {}) self.id = UUID.new.generate @new_record = true assign_attributes(attributes) object = yield self if block_given? object end |
Class Method Details
.attribute(*options) ⇒ Object
定义需要持久化的属性
示例:
class User < ActiveObject::Base
attribute :email,:name,:password # 表示email,name,password需要持久化存储
end
81 82 83 84 85 86 |
# File 'lib/active_object/base.rb', line 81 def attribute(*) .each do |attribute| attr_accessor attribute end merge_attributes end |
.attributes ⇒ Object
88 89 90 |
# File 'lib/active_object/base.rb', line 88 def attributes read_inheritable_attribute(:attributes) end |
.base_class ⇒ Object
def delete(id) end
217 218 219 |
# File 'lib/active_object/base.rb', line 217 def base_class class_of_active_object_descendant(self) end |
.configurations ⇒ Object
138 139 140 |
# File 'lib/active_object/base.rb', line 138 def configurations @@configurations end |
.configure(model, config) ⇒ Object
配置ActiveObject访问的后台数据库支撑,目前支持LightCloud/TokyoTyrant/TokyoCabinet。
参数 +model+ 用于描述后台数据库的类型。
:TC => 表示TokyoCabinet
:TT => 表示TokyoTyrant
:LC => 表示LightCloud
参数 +config+ 用于接收后台数据库的配置信息。
当model指定为TokyoCabinet数据库时,config为指定的文件名,例如:
ActiveObject::Base.configure :TC, File.join(File.dirname(__FILE__),'act.tch')
这里需要注意的是指定的文件名后缀符合TokyoCabinet的约定规则。更多信息请参看:http://tokyocabinet.sourceforge.net/spex-en.html#tcadbapi
当model指定为TokyoTyrant数据库时, config为指定的远程服务器地址,例如:
ActiveObject::Base.configure :TT, '127.0.0.1:54321'
当model指定为LightCloud数据库时, config可以接收符合配置规则的hash:
ActiveObject::Base.configure :LC, {'user'=>{'lookup_one'=>['127.0.0.1:30001','127.0.0.1:33001'],'storage_one'=>['127.0.0.1:20001','127.0.0.1:24001']}}
也可以是配置文件的文件名。
ActiveObject::Base.configure :LC, File.join(File.dirname(__FILE__),'config.yml')
123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/active_object/base.rb', line 123 def configure(model,config) @@configurations = config @@database_model = model case @@database_model when :TC ActiveObject::Base.send :include,ActiveObjectTokyoCabinet when :TT ActiveObject::Base.send :include,ActiveObjectTokyoTyrant when :LC ActiveObject::Base.send :include,ActiveObjectLightCloud else raise ConfigError,'没有指定数据库类型!' end end |
.create(attributes = nil, &block) ⇒ Object
新建对象(或多个对象)并保存到数据库(假设都通过验证) 不管是否保存到数据库,都将返回对象.
参数 attributes
可以是Hash或Hash数组.
示例
# 创建单个新对象
User.create(:first_name => 'Jamie')
# 创建多个对象
User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }])
# 创建对象,并通过块进行其它属性的赋值.
User.create(:first_name => 'Jamie') do |u|
u.is_admin = false
end
# 创建多个对象,并通过块进行其它属性的赋值,每个对象都会执行块:
User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u|
u.is_admin = false
end
189 190 191 192 193 194 195 196 197 198 |
# File 'lib/active_object/base.rb', line 189 def create(attributes = nil, &block) if attributes.is_a?(Array) attributes.collect { |attr| create(attr, &block) } else object = new(attributes) yield(object) if block_given? object.save object end end |
.database_model ⇒ Object
返回当前所使用的数据库模型
:TC表示采用的是TokyoCabinet
:TT表示采用的是TokyoTyrant
:LC表示采用的是LightCloud
146 147 148 |
# File 'lib/active_object/base.rb', line 146 def database_model @@database_model end |
.deserialize_attributes(raw_record) ⇒ Object
242 243 244 |
# File 'lib/active_object/base.rb', line 242 def deserialize_attributes(raw_record) Marshal.load(raw_record) end |
.destroy(id) ⇒ Object
209 210 211 |
# File 'lib/active_object/base.rb', line 209 def destroy(id) find(id).destroy end |
.find(id) ⇒ Object
157 158 159 160 161 |
# File 'lib/active_object/base.rb', line 157 def find(id) return nil if id.blank? record = load(id) record ? instance(id,record) : nil end |
.id_to_key(id) ⇒ Object
通过id转换成存取用的key
233 234 235 |
# File 'lib/active_object/base.rb', line 233 def id_to_key(id) "#{self.to_s}_#{id}" end |
.key_to_id(key) ⇒ Object
将key转换成id
238 239 240 |
# File 'lib/active_object/base.rb', line 238 def key_to_id(key) key[key.index("_")+1..-1] end |
.primary_key(value = nil) ⇒ Object
92 93 94 95 96 97 98 |
# File 'lib/active_object/base.rb', line 92 def primary_key(value=nil) if value write_inheritable_attribute :primary_key,value else read_inheritable_attribute(:primary_key) end end |
.self_and_descendents_from_active_object ⇒ Object
nodoc:
221 222 223 224 225 226 227 228 229 230 |
# File 'lib/active_object/base.rb', line 221 def self_and_descendents_from_active_object#nodoc: klass = self classes = [klass] while klass != klass.base_class classes << klass = klass.superclass end classes rescue [self] end |
.serialize_attributes(record) ⇒ Object
246 247 248 |
# File 'lib/active_object/base.rb', line 246 def serialize_attributes(record) Marshal.dump(record) end |
Instance Method Details
#attributes ⇒ Object
299 300 301 |
# File 'lib/active_object/base.rb', line 299 def attributes self.class.attributes end |
#delete ⇒ Object
从数据库中删除对象 不像 #destroy, 这个方法不运行 before_delete
和 after_delete
回调.
325 326 327 328 |
# File 'lib/active_object/base.rb', line 325 def delete self.class.delete(id) unless new_record? @destroyed = true end |
#destroy ⇒ Object
338 339 340 |
# File 'lib/active_object/base.rb', line 338 def destroy delete end |
#destroyed? ⇒ Boolean
如果对象已经被删除,返回true,否则返回false。
319 320 321 |
# File 'lib/active_object/base.rb', line 319 def destroyed? @destroyed || false end |
#id ⇒ Object
309 310 311 |
# File 'lib/active_object/base.rb', line 309 def id self.class.key_to_id(@key) end |
#id=(value) ⇒ Object
id用来标识对象 为了能够通过前缀访问对象,在uuid之前加入对象的类名作为存取的key
305 306 307 |
# File 'lib/active_object/base.rb', line 305 def id=(value) @key = self.class.id_to_key(value) end |
#new_record? ⇒ Boolean
如果对象没有被存储,表明对象还是新记录,返回true,否则返回false.
314 315 316 |
# File 'lib/active_object/base.rb', line 314 def new_record? @new_record end |
#reload ⇒ Object
从数据库中重新加载对象的属性
343 344 345 346 347 348 349 350 351 352 353 354 |
# File 'lib/active_object/base.rb', line 343 def reload #raise "Object is deleted" if destroyed? unless new_record? begin attributes = self.class.send :load, self.id assign_attributes(attributes) true rescue false end end end |
#save ⇒ Object
:call-seq:
save(perform_validation = true)
保存对象.
如果对象是新对象,那么在数据库中创建。否则,如果对象是数据库中已经存在的对象,那么更新数据库
如果 perform_validation
是true,将执行验证。如果验证失败,那么动作被取消,并且返回false。
save
相关联的一系列回调. 如果任何一个before_*
回调返回 false
,那么save
动作被取消并返回 false
.
366 367 368 |
# File 'lib/active_object/base.rb', line 366 def save create_or_update end |
#save! ⇒ Object
执行save!
时,验证总是被运行。只要有任意一个执行失败都将抛出 ActiveObject::ObjectInvalid异常。
save
相关联的一系列回调. 如果任何一个before_*
回调返回 false
,那么save
动作被取消并返回 false
,并且抛出ActiveObject::RecordNotSaved.
377 378 379 |
# File 'lib/active_object/base.rb', line 377 def save! create_or_update || raise(ObjectNotSaved) end |
#update_attributes(options = {}) ⇒ Object
更新对象属性
<tt>options</tt>是需要更新的一组Hash
332 333 334 335 336 |
# File 'lib/active_object/base.rb', line 332 def update_attributes(={}) .each do |key,value| self.send("#{key}=",value) if self.respond_to?("#{key}=") end end |