Class: AntMapper::Base

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

Constant Summary collapse

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = nil) ⇒ Base

Returns a new instance of Base.



255
256
257
258
259
# File 'lib/ant_mapper/base.rb', line 255

def initialize(attributes = nil)
	assign_attributes(attributes)
    result = yield self if block_given?
    result
end

Class Method Details

.attributesObject



102
103
104
# File 'lib/ant_mapper/base.rb', line 102

def attributes
	read_inheritable_attribute(:attributes)
end

.base_classObject



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

def base_class
  class_of_ant_mapper_descendant(self)
end

.configurationsObject



143
144
145
# File 'lib/ant_mapper/base.rb', line 143

def configurations
	@@configurations
end

.configure(model, config) ⇒ Object

配置Ant访问的后台数据库支撑,目前支持LightCloud/TokyoTyrant/TokyoCabinet。

参数 +model+ 用于描述后台数据库的类型。
   :TC => 表示TokyoCabinet
   :TT => 表示TokyoTyrant
   :LC => 表示LightCloud

参数 +config+ 用于接收后台数据库的配置信息。

	  当model指定为TokyoCabinet数据库时,config为指定的文件名,例如:
      AntMapper::Base.configure :TC, File.join(File.dirname(__FILE__),'act.tch')
   这里需要注意的是指定的文件名后缀符合TokyoCabinet的约定规则。更多信息请参看:http://tokyocabinet.sourceforge.net/spex-en.html#tcadbapi

   当model指定为TokyoTyrant数据库时, config为指定的远程服务器地址,例如:
      AntMapper::Base.configure :TT, '127.0.0.1:54321'

   当model指定为LightCloud数据库时, config可以接收符合配置规则的hash:
      AntMapper::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']}}
   也可以是配置文件的文件名。
      AntMapper::Base.configure :LC, File.join(File.dirname(__FILE__),'config.yml')


128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/ant_mapper/base.rb', line 128

def configure(model,config)
	@@configurations = config
	@@database_model = model
	case @@database_model
		when :TC
			AntMapper::Base.send :include,AntTokyoCabinet
		when :TT
			AntMapper::Base.send :include,AntTokyoTyrant
		when :LC
			AntMapper::Base.send :include,AntLightCloud
		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


185
186
187
188
189
190
191
192
193
194
# File 'lib/ant_mapper/base.rb', line 185

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



147
148
149
# File 'lib/ant_mapper/base.rb', line 147

def database_model
	@@database_model
end

.destroy(key) ⇒ Object

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

参数

  • key - 对象的主关键字.

示例

User.destroy('[email protected]')


205
206
207
# File 'lib/ant_mapper/base.rb', line 205

def destroy(key)
	find(key).destroy
end

.find(key) ⇒ Object

通过主关键字查找对象

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

Example

User.find('[email protected]')


158
159
160
161
162
# File 'lib/ant_mapper/base.rb', line 158

def find(key)
	return nil if key.blank?
	record = load(key)
	record ? instance(key,record) : nil
end

.primary_keyObject



98
99
100
# File 'lib/ant_mapper/base.rb', line 98

def primary_key
	read_inheritable_attribute(:primary_key)
end

.self_and_descendents_from_ant_mapperObject

nodoc:



213
214
215
216
217
218
219
220
221
222
# File 'lib/ant_mapper/base.rb', line 213

def self_and_descendents_from_ant_mapper#nodoc:
  klass = self
  classes = [klass]
  while klass != klass.base_class
    classes << klass = klass.superclass
  end
  classes
rescue
  [self]
end

.set_attributes(*options) ⇒ Object

定义需要持久化的属性

示例:
  class User < AntMapper::Base
    set_attributes :email,:name,:password  # 表示email,name,password需要持久化存储
  end


90
91
92
93
94
95
# File 'lib/ant_mapper/base.rb', line 90

def set_attributes(*options)
	options.each do |attribute|
	  attr_accessor attribute
	end
	write_inheritable_attribute :attributes,options
end

.set_primary_key(*options) ⇒ Object

设置类的主关键字 对象根据设置的主关键字进行持久化存储 示例:

class User < AntMapper::Base
  set_primary_key :email           # 表示User对象以email作为主关键字
end


81
82
83
# File 'lib/ant_mapper/base.rb', line 81

def set_primary_key(*options)
  write_inheritable_attribute :primary_key,options
end

Instance Method Details

#deleteObject

从数据库中删除对象 不像 #destroy, 这个方法不运行 before_deleteafter_delete 回调.



277
278
279
280
# File 'lib/ant_mapper/base.rb', line 277

def delete
  self.class.delete(object_key) unless new_record?
  @destroyed = true
end

#destroyObject



282
283
284
# File 'lib/ant_mapper/base.rb', line 282

def destroy
	delete
end

#destroyed?Boolean

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

Returns:

  • (Boolean)


267
268
269
# File 'lib/ant_mapper/base.rb', line 267

def destroyed?
  @destroyed || false
end

#new_record?Boolean

如果对象没有被存储,表明对象还是新记录,返回true,否则返回false.

Returns:

  • (Boolean)


262
263
264
# File 'lib/ant_mapper/base.rb', line 262

def new_record?
  @object_key ? false : true
end

#object_keyObject



271
272
273
# File 'lib/ant_mapper/base.rb', line 271

def object_key
	@object_key
end

#reloadObject

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



287
288
289
290
291
292
293
294
295
296
297
298
# File 'lib/ant_mapper/base.rb', line 287

def reload
			#raise "Object is deleted" if destroyed?
			unless new_record?
begin
	attributes = self.class.send :load, self.object_key
	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.



310
311
312
# File 'lib/ant_mapper/base.rb', line 310

def save
	create_or_update
end

#save!Object

执行save!时,验证总是被运行。只要有任意一个执行失败都将抛出 ActiveObject::ObjectInvalid异常。

save 相关联的一系列回调. 如果任何一个before_*回调返回 false,那么save动作被取消并返回 false,并且抛出ActiveObject::RecordNotSaved.



321
322
323
# File 'lib/ant_mapper/base.rb', line 321

def save!
  create_or_update || raise(ObjectNotSaved)
end