Class: ActiveObject::Base

Inherits:
Object show all
Defined in:
lib/active_object/base.rb

Constant Summary collapse

@@configurations =
nil
@@database_model =
nil
@@connection =
nil

Class Method Summary collapse

Instance Method Summary collapse

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(*options)
	options.each do |attribute|
	  attr_accessor attribute
	end
	merge_attributes options
end

.attributesObject



88
89
90
# File 'lib/active_object/base.rb', line 88

def attributes
	read_inheritable_attribute(:attributes)
end

.base_classObject

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

.configurationsObject



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_modelObject

返回当前所使用的数据库模型

: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

删除主关键字与参数 id 匹配的对象,并且在删除之前执行所有的回调和过滤。

参数

  • id - 对象的主关键字.

示例

User.destroy('[email protected]')


209
210
211
# File 'lib/active_object/base.rb', line 209

def destroy(id)
	find(id).destroy
end

.find(id) ⇒ Object

通过主关键字查找对象

+id+ 参数表示需要找回的主关键字.

Example

User.find('[email protected]')


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_objectObject

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

#attributesObject



299
300
301
# File 'lib/active_object/base.rb', line 299

def attributes
	self.class.attributes
end

#deleteObject

从数据库中删除对象 不像 #destroy, 这个方法不运行 before_deleteafter_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

#destroyObject



338
339
340
# File 'lib/active_object/base.rb', line 338

def destroy
	delete
end

#destroyed?Boolean

如果对象已经被删除,返回true,否则返回false。

Returns:

  • (Boolean)


319
320
321
# File 'lib/active_object/base.rb', line 319

def destroyed?
  @destroyed || false
end

#idObject



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.

Returns:

  • (Boolean)


314
315
316
# File 'lib/active_object/base.rb', line 314

def new_record?
  @new_record
end

#reloadObject

从数据库中重新加载对象的属性



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

#saveObject

: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(options={})
	options.each do |key,value|
		self.send("#{key}=",value) if self.respond_to?("#{key}=")
	end
end