|
按照前面规划的数据结构,我们在Rails中编写建立数据表的代码,这里将按照RubyOnRails的规范来写,理解起来也比较容易。
首先创建保存开发者信息的表Members,其代码如下:
java代码: class CreateMembers
< ActiveRecord::Migration def self.up create_table :members do |t| t.string
:email t.string
:password t.string
:nickname t.text
:desc # t.string
:name t.string
:address t.string
:phone t.string
:blog #state t.integer :state,:default => 1 t.timestamps end add_index
:members,
:nickname add_index :members,
:email end def self.down drop_table
:members end end
代码解释:
def self.up模块中定义了创建表和索引,这里创建一个表为members,其中字段有邮箱(email)、密码(password)、昵称(nickname)、个人描述(desc),这些是开发者登录和展示需要的信息;另外,为了方便联系开发者,还需要他们提供名字、地址、电话等私人信息;最后还有标识该开发者账号的注册时间、更新时间(timestamps)和状态信息(state)的字段,以方便跟踪该开发者的动态。接下来,add_index用来添加索引信息,上述代码给members表的nickname和email添加索引。
接着创建另外一张表clients,用来保存客户端信息,其代码如下:
java代码:
class CreateClients < ActiveRecord:
:Migration def self.up create_table
:clients do |t| t.string
:name,
:limit=>60 t.text
:desc t.string :api_key,
:limit => 60 t.string
:api_secret,
:limit=>60 #member t.integer
:member_id t.integer
:state,
:default => 1 t.integer
:install_count,
:default => 0 t.timestamps end add_index
:clients,:api_key add_index
:clients,
:member_id end def self.down drop_table :clients end end
代码解释:
def self.up模块用来创建表结构和索引,这段代码用于创建clients表,其中包含客户端应用的名字(name)、客户端的描述(desc);还有两个非常重要的属性api_key 和api_secret,用来生成签名以通过服务器端的认证。另外,我们需要知道客户端是哪个开发者申请的,我们用member_id来保存申请该客户端的开发者编号,用install_count来统计每个客户端有多少用户。此外,我们还为api_key、member_id创建了索引,以方便获取数据。
def self.down模块比较简单,用来删除表。
下面创建locales表,这个表用来保存用户的locale信息,通过这个表,我们可以比较方便地针对每个locale返回相应的数据,其代码如下:
java代码:
class CreateLocales
< ActiveRecord::Migration def self.up create_table
:locales do |t| t.string
:coutry_code t.string
:language_code t.timestamps end #add Index add_index :locales,[:coutry_code,:language_code] #init Locale.new(:coutry_code=>"unknown",
:language_code=>"rUnknown").save end def self.down drop_table
:locales end end
代码解释:
我们将使用users表保存用户信息,用通话手机的唯一码来标识一个用户能省去用户输入邮箱来标识自己的麻烦,要始终牢记,在手机上的应用要尽可能减少用户的文字输入。此外,用locale_id来标识这个用户的区域,用client_id来标识这个用户是从哪个客户端过来的。然后为uniquely_code、client_id和locale_id创建需要的索引信息。
drop_table :users用来删除这个表。
接着,我们创建一个叫做nonces的表,用来存储客户端访问服务器的信息。为了安全起见,我们还要对每次请求都进行认证,其方式是让客户端发请求时按照一定的规则生成一个签名,服务器接收到请求后,根据规则生成该签名,如果一致,就可以确定来源请求是被认证的。
为了避免客户端发送的请求被第三方嗅探或者截取,进而通过这个请求伪装来获取信息,针对每个请求,我们都要验证其是否已经请求过,如果已经请求过,就认为这个请求已经失效,则不返回数据。其原理是每次请求都生成一个时间戳和一个唯一码,如果服务器发现这两个码已经请求过了,则可以判断其请求是重复的,这个表就是用来保存这个信息的,代码如下:
java代码:
class CreateNonces < ActiveRecord:
:Migration def self.up create_table
:nonces,
ptions => "ENGINE=MyISAM" do |t| t.string
:nonce,:limit=>40 t.string
:timestamp,:limit=>15 t.string
:api_key t.string
:controller_name t.string
:action_name t.string
:remote_ip t.integer :locale_id,
:default => 1 t.integer
:user_id t.timestamps end #Add some index add_index
:nonces,[:nonce,:timestamp],
:unique add_index
:nonces,
:api_key add_index
:nonces,
:locale_id add_index
:nonces,:user_id end def self.down drop_table
:nonces end end
代码解释:
def self.up代码段用来创建表和表的属性及相关的索引,这里创建了一个nonces表,其中比较重要的是时间戳timestamp属性和唯一码nonce属性。除此之外,我们还需要保存该请求中的一些重要信息,以方便进行进一步监控、数据统计和分析,诸如api_key代表来源请求使用的客户端api_key,controller_name代表来源请求的控制器名,action_name标识来源请求请求的是哪个方法,locale_id表示其来源请求的客户端所在的手机的lcoale信息,remote_ip则标识来源请求的IP信息,user_id标识该请求是哪个用户发出的,以方便我们针对个人做行为统计和分析。除此之外,我们需要为后面经常用到的属性添加必要的索引,以加快查询的速度,这里需要为nonce和timestamp做联合唯一索引,为api_key、locale_id和user_id做单键索引。
def self.down块的作用是一样的,用来删除nonce表。
现在轮到创建保存笑话的jokes表了,其代码如下:
java代码:
class CreateJokes < ActiveRecord:
:Migration def self.up create_table
:jokes do |t| t.string
:title #笑话的标题 t.text
:content #内容 t.string
:user_id #用户标识ID t.integer
:locale_id #区域编码
t.integer :client_id #客户端编码
#some stat t.integer
:good_count,:default => 0
#好评数 t.integer :bad_count,:default => 0
#差评数 t.integer :report_count,:default => 0
#报告违法数 t.integer :state,:default => 1
#状态 t.timestamps end #add index add_index
:jokes,:locale_id add_index
:jokes,:user_id add_index
:jokes,
:client_id end def self.down drop_table
:jokes end end
代码解释:
笑话自身需要标题和内容两个必须的内容属性,除此之外,我们需要用user_id来标识这个笑话是哪个用户创建的,用locale_id标识创建该笑话时的locale信息,用client_id来标识这个笑话来源是哪个客户端。然后,我们还需要保存该笑话的一些统计信息,用good_count来标识这个笑话被好评的次数,用bad_count标识这个笑话被差评的次数,用report_count属性标识这个笑话被人举报非法的次数,用state来标识这个笑话是否还依然有效。
创建完笑话表结构后,我们还需要为一些需要经常用来检索信息的字段创建索引,这里分别为locale_id、user_id和client_id创建单键索引。
同样,drop_table :jokes用来删除该表。还需要最后一个表joke_logs,这个表用来记录用户对笑话的操作记录,这里的操作目前包含三个,分别是好评、差评和举报非法。为了防止有捣乱的用户恶意连续评价,也为了跟踪一个用户的操作行为,我们将通过这个表记录用户对笑话的操作记录。
java代码:
class CreateJokeLogs < ActiveRecord:
:Migration def self.up create_table
:joke_logs do |t| t.integer
:joke_id #笑话ID t.integer
:user_id #用户唯一码 t.integer
:typee #这个字段标识该log类型,目前包括“好评、差评、举报非法”
t.timestamps end add_index
:joke_logs,[:user_id,:joke_id] end def self.down drop_table
:joke_logs end end |
|