Archive for the 'Database' Category

Mar
28

我想找到一个类似acts_as_commentable和acts_as_rateable的plugins,给任何一个object统计阅读次数,结果没有找到。于是开始动手写一个acts_as_countable,由于编写时间较短,该插件虽然实现了counter的功能,但效率低下,而且在page_cache时无法使用,以下是公开的源代码,有需要的朋友可以加以改进。

一、Create Table

CREATE TABLE `counts` (
`id` int(11) NOT NULL auto_increment,
`count` int(11) default ‘1′,
`created_at` datetime NOT NULL,
`countable_id` int(11) NOT NULL default ‘0′,
`countable_type` varchar(15) NOT NULL default ‘’,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

二、Create plugin

ruby script/generate plugin acts_as_countable

三、Open /vendor/plugins/act_as_countable/lib/act_as_countable.rb and put this code inside:

# ActsAsCountable
module Jesse
module Acts #:nodoc:
module Countable #:nodoc:

def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def acts_as_countable
has_many :counts, :as => :countable, :dependent => :destroy, :o rder => ‘created_at DESC’
include Jesse::Acts::Countable::InstanceMethods
extend Jesse::Acts::Countable::SingletonMethods
end
end
module SingletonMethods
def find_counts_for(obj)
countable = ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s
Count.find(:first,
:conditions => [”countable_id = ? and countable_type = ?”, obj.id, countable])
end
end
module InstanceMethods
def counter
Count.find(:first,
:conditions => [”countable_id = ? and countable_type = ?”, id, self.type.name])
end
# Helper method that defaults the submitted time.
def add_count(count)
counter = Count.find(:first, :conditions => [”countable_id = ? and countable_type = ?”, count.countable_id, self.type.name ])
if counter.nil?
counts << count
else
counter.update_attribute(:count, counter.count + 1)
end
end
end

end
end
end

四、Create /vendor/plugins/act_as_countable/lib/count.rb and put this code inside:

class Count < ActiveRecord::Base
belongs_to :countable, :polymorphic => true

def self.find_counts_for_countable(countable_str, countable_id)
find(:first,
:conditions => [”countable_type = ? and countable_id = ?”, countable_str, countable_id]
)
end

def self.find_countable(countable_str, countable_id)
countable_str.constantize.find(countable_id)
end
end

五、put this code inside our /vendor/plugins/act_as_countable/init.rb

require ‘acts_as_countable’
ActiveRecord::Base.send(:include, Jesse::Acts::Countable)

六、How to Use

1. put acts_as_countable inside model, like acts_as_commentable

2. in view action:

count = Count.new
count.countable_id = @obj.id
@obj.add_count(count)

Resources:

Feb
27

使用XAMPP能够很方便的安装Apache环境,在使用Ruby on Rails连接MySql时会出现以以错误:

No such file or directory - /tmp/mysql.sock

原因是XAMPP的mysql.sock文件在以下路径:

/opt/lampp/var/mysql/mysql.sock

Ruby on Rails 按照默认的路径去找,就找不到。在XAMPP integration上提到的Patch方法已经不实用于Rails 1.1.6以后的版本,正确的修正方法是修改config/database.yml文件,如下:

development:
adapter: mysql
database: depot_development
username: root
password:
host: localhost
socket: /opt/lampp/var/mysql/mysql.sock

参考:Agile Web Development with Rails Page 72

Jan
18

DreamHost 提供了 SSH/SFTP 进行文件管理 和 phpMyAdmin 进行数据库管理。要想将自己的应用备份下来,首先 SSH 登录到服务器上将程序文件压缩,然后使用SFTP下载即可。如果数据库很小(几M以内),则可以使用 phpMyAdmin 的导出功能将数据库备份到本地,如果数据库很大,又有台湾海底光缆的问题,导出一般不会成功,需要使用 mysqldump 进行备份了。以下是从DreamHost备份www.chinaonrails.com的程序文件和数据库的过程:

一、使用 SecureCRT 登录到服务器,压缩程序文件

tar -zcf chinaonrails.com.tar.gz chinaonrails.com/

二、使用 mysqldump 备份数据库

mysqldump -u username -h mysql.chinaonrails.com -p

database | gzip > chinaonrails20070118.sql.gz

三、使用 SecureFX 将 chinaonrails.com.tar.gz 和 chinaonrails20070118.sql.gz 下载至本地

十一月
15

许多人通过他们自己的经验认识到安装 Apache 服务器是件不容易的事儿。如果您想添加 MySQL、PHP 和 Perl,那就更难了。XAMPP 是一个易于安装且包含 MySQL、PHP 和 Perl 的 Apache 发行版。XAMPP 的确非常容易安装和使用:只需下载,解压缩,启动即可。

到目前为止,XAMPP 共有以下四种版本:

  • 适用于 Linux 的版本(已在 Ubuntu、SuSE、RedHat、Mandrake 和 Debian 下通过测试),
  • 适用于 Windows 98、NT、2000、2003 和 XP 的版本,
  • 适用于 Solaris SPARC 的测试版(在 Solaris 8 环境下开发并测试),
  • 适用于 Mac OS X 的测试版。

适用于 Mac OS X 和 Solaris 的 XAMPP 版本尚处于开发的第一阶段。使用时风险自担!

备注:LAMP - Linux+Apache+MySQL+PHP/Perl/Python.

九月
10

以下描述在Windows环境下开发RoR,使用UTF-8编码保存SQL Server中文的方法:

一、安装DBI 0.1.0,下载地址为(http://ruby-dbi.sourceforge.net)

二、安装RubyODBC 0.996,安装方法是将zip包中的文件Copy到…/ruby/1.8/i386-mswin32目录下,下载地址为(http://www.ch-werner.de/rubyodbc/)

三、在Rails App的application.rb文件下加入以下代码:

class ApplicationController < ActionController::Base  before_filter :configure_charsets   
def configure_charsets       
@headers[”Content-Type”] = “text/html; charset=utf-8″  
end
end 

四、environment.rb文件末尾中加入以下代码

require ‘odbc_utf8′ 

五、打开Windows控制面版->管理工具->数据源ODBC,创建系统DNS数据源,这里数据源名称命名为“192.168.0.10 

六、修改database.yml文件

development: 

adapter: sqlserver 

mode: odbc 

dsn: 192.168.0.10 

username: sa

password: sa