class SQLManager
@params = nil
@record = nil
@columns = nil
@orders = nil
@groups = nil
@conditions = nil
@joins = nil
@havings = nil
@firsts = nil
@lasts = nil
@limit = nil
@offset = nil
@table_name = nil
def initialize(record,init_params={})
if(record.class == String)
@record = eval(record.classify + ".new")
else
@record = record
end
@table_name = @record.class.table_name
self.init_params init_params.class
self.merge_param(init_params)
@columns = []
@orders = []
@groups = []
@conditions = []
@joins = []
@havings = []
@firsts = []
@lasts = []
end
def init_params c
@params = c.new
end
def self.clone(sm)
c_sm = sm.clone
new_sm = SQLManager.new(c_sm.record,c_sm.params)
new_sm.columns.concat Marshal.load(Marshal.dump(sm.columns))
new_sm.orders.concat Marshal.load(Marshal.dump(sm.orders))
new_sm.groups.concat Marshal.load(Marshal.dump(sm.groups))
new_sm.conditions.concat Marshal.load(Marshal.dump(sm.conditions))
new_sm.joins.concat Marshal.load(Marshal.dump(sm.joins))
new_sm.havings.concat Marshal.load(Marshal.dump(sm.havings))
new_sm.firsts.concat Marshal.load(Marshal.dump(sm.firsts))
new_sm.lasts.concat Marshal.load(Marshal.dump(sm.lasts))
new_sm.limit = c_sm.limit
new_sm.offset = c_sm.offset
new_sm
end
def self.union(*unions)
a = *unions
u_sql = a[0]
p u_sql.to_query
a.delete_at 0
a.each do |u|
u_sql.lasts << " UNION " << u.to_query
u_sql.merge_param(u.params)
end
u_sql
end
def self.union_all(*unions)
a = *unions
u_sql = a[0]
p u_sql.to_query
a.delete_at 0
a.each do |u|
u_sql.lasts << " UNION ALL " << u.to_query
u_sql.merge_param(u.params)
end
u_sql
end
def record
@record
end
def params
@params
end
def merge_param(param)
c = param.class
if c == Hash
@params = @params.merge(param)
elsif c == Array
@params.concat param
elsif c == String || c == Fixnum || c == TrueClass || c == Float || c == Time
@params << param
else
param.attributes.collect{ |att|
@params = @params.merge({att[0].to_sym,att[1]})
}
end
end
def columns
@columns
end
def orders
@orders
end
def groups
@groups
end
def conditions
@conditions
end
def joins
@joins
end
def havings
@havings
end
def firsts
@firsts
end
def lasts
@lasts
end
def limit
@limit
end
def limit=(att)
@limit = att
end
def offset
@offset
end
def offset=(att)
@offset = att
end
def table_name
@table_name
end
def to_columns
str = ""
@columns.each do |item|
str << item + ','
end
str = str.chop
(str << @table_name << ".*") if columns.size == 0
str
end
def to_orders
str = ""
@orders.each do |item|
str << item + ','
end
str.chop
end
def to_groups
str = ""
@groups.each do |item|
str << item + ','
end
str.chop
end
def to_conditions
str = ""
@conditions.each do |item|
str << item + ' '
end
str.chop
end
def to_havings
str = ""
@havings.each do |item|
str << item + ' '
end
str.chop
end
def to_firsts
str = ""
@firsts.each do |item|
str << item + ' '
end
str.chop
end
def to_lasts
str = ""
@lasts.each do |item|
str << item + ' '
end
str.chop
end
def to_joins
str = ""
@joins.each do |item|
str << item + ' '
end
str.chop
end
def to_query
first = to_firsts
condition = to_conditions
join = to_joins
column = to_columns
group = to_groups
having = to_havings
order = to_orders
last = to_lasts
sql = "SELECT "
sql << column if !column.empty?
sql << " FROM "
sql << @table_name
sql << " " << join if !join.empty?
sql << " WHERE " << condition if !condition.empty?
sql << " GROUP BY " << group if !group.empty?
sql << " HAVING " << having if !having.empty?
sql << " ORDER BY " << order if !order.empty?
if @offset.nil?
sql << " LIMIT " << @limit.to_s if !@limit.nil?
else
sql << " LIMIT #{@offset.to_s},#{@limit.to_s}" if !@limit.nil?
end
(sql << " " << last) if !last.empty?
(sql.insert 0,(first << " ")) if !first.empty?
sql
end
def to_total
total_sql = SQLManager.clone(self)
total_sql.limit = nil
total_sql.offset = nil
if !@groups.empty?
total_sql.firsts << "SELECT COUNT(*) AS total FROM ("
total_sql.lasts << ") temp_table"
else
total_sql.columns.clear
total_sql.columns << "COUNT(#{total_sql.table_name}.id) AS total"
end
total_sql
end
def query
s = [to_query]
if(@params.class == Hash)
s << @params
else
s.concat @params
end
@record.class.find_by_sql s
end
def total
self.to_total.query.first['total']
end
def paging(page=0,limit=20)
self.limit = limit
self.offset = limit * page
data = self.query
total = self.total
page_total = (total.to_f/limit).ceil
params = self.params
{:data=>data,:total=>total,:page=>page,:page_total=>page_total,:limit=>self.limit,:offset=>self.offset}
end
end
分享到:
相关推荐
版本管理工具如RVM(Ruby Version Manager)和rbenv可以帮助你管理多个Ruby版本。 总的来说,Ruby是一门强大且富有表达力的语言,适合快速开发和原型设计。通过这个中文教程,你将掌握其基本语法,理解面向对象编程...
这可以通过Ruby版本管理器如RVM(Ruby Version Manager)或者rbenv来完成,它们允许你轻松地切换和管理不同的Ruby版本。 2. **安装Rails**:安装完Ruby后,使用gem包管理器安装Rails 2.2.3。运行`gem install rails...
- **Ruby 版本管理**: 使用 RVM (Ruby Version Manager) 来管理不同项目所需的 Ruby 版本。 - **安装 Rails**: - 安装完成后可以通过 `rails -v` 命令来查看 Rails 的版本。 - **IDE 和编辑器**: 推荐使用如 Visual...
- **安装 Ruby**:通过 RVM(Ruby Version Manager)或 rbenv 管理多个 Ruby 版本。 - **安装 Rails**:使用 gem 安装 Rails 框架。 - **设置数据库**:配置数据库连接,如 MySQL 或 PostgreSQL。 5. **Web 应用...
3. **安装 RVM(Ruby Version Manager):** 使用 curl 获取 RVM 安装脚本并执行: ```sh curl -L https://get.rvm.io | bash -s stable ``` 4. **加载 RVM:** - 对于普通用户: ```sh source ~/.rvm/...
首先,我们来安装RVM(Ruby Version Manager)。RVM是一个方便的工具,允许你在同一台机器上管理多个版本的Ruby。通过运行以下命令来安装RVM: ```bash curl -sSL https://get.rvm.io | bash -s stable ``` 接着,...
- **GUI工具**:例如MySQL-Front、EMS MySQL Manager、Navicat等,为用户提供更友好的图形界面操作体验。 #### 四、MySQL存储引擎概览 MySQL支持多种存储引擎,每种存储引擎都有其特定的优势和应用场景,下面是...
3. **RVM (Ruby Version Manager)**:用于管理和切换不同的Ruby版本。 4. **Ruby**:Redmine的核心运行环境。 5. **RubyGems**:Ruby的包管理器,用于安装和管理Ruby的外部库。 6. **Rails (Ruby on Rails)**:...
4. **ActiveRecord**: Rails 的 ORM(对象关系映射)组件,允许开发者通过 Ruby 代码操作数据库,无需编写 SQL 查询。ActiveRecord 将数据库表与 Ruby 类关联起来,使得数据操作更加方便。 5. **路由**: Rails 的...
6. **版本管理与依赖管理**:Ruby的版本管理和依赖管理工具如RVM(Ruby Version Manager)和Bundler在项目中起到关键作用。博客可能讲解如何有效地管理Ruby版本和项目依赖。 7. **测试驱动开发(TDD)与行为驱动...
Ruby的版本管理器如RVM(Ruby Version Manager)或rbenv可以帮助你轻松地切换和管理不同的Ruby版本。确保正确安装并激活所需版本是至关重要的,因为不同版本的Ruby可能有语法或库的差异,这会影响到代码的执行。 接...
- **安装与环境配置**:了解如何在不同操作系统上安装Ruby及Ruby on Rails开发环境,如RVM(Ruby Version Manager)的使用。 - **变量与数据类型**:深入理解Ruby中的基本数据类型,包括字符串、数字、符号、数组...
【rails-garden-manager】是一个基于Ruby编程语言的Web应用程序,它使用了著名的Web开发框架Ruby on Rails(简称Rails)。Rails是MVC(Model-View-Controller)架构的典范,为开发者提供了一种高效、简洁的方式来...
自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。... Ruby版本 系统依赖 组态 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...
Fabric_Manager 是一个基于 Ruby 开发的应用程序,专为面料销售商设计,旨在帮助他们高效地管理和分析面料交易记录。这个项目不仅提供了基本的清单管理功能,还具备强大的统计功能,利用 D3.js 库生成可视化数据图表...
Rails花园经理(Rails Garden Manager SD)是一款基于Ruby on Rails框架构建的应用程序,由专业团队精心打造。Rails是Ruby编程语言的一个强大Web开发框架,它以其MVC(模型-视图-控制器)架构模式、约定优于配置的...
数据库技术:如关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如MongoDB、Redis)等。 前端开发:HTML、CSS、JavaScript等用于构建网页和Web应用程序的技术。 后端开发:涉及服务器端编程、API开发...
Rails DB Manager是一个专门为Ruby on Rails开发的数据库管理工具,它主要设计用来简化PostgreSQL数据库的创建和维护工作。在Rails框架中,数据库管理是应用程序生命周期中的关键环节,尤其是在开发、测试和生产环境...
Arel是Ruby on Rails中用于构建和执行SQL查询的一个强大工具,它提供了一种面向对象的方式来表示数据库操作。现在我们将深入研究如何在JavaScript中实现类似的抽象层。 **Arel简介** Arel是Ruby的一个库,它为处理...
PowerBuilder (PowerScript), PHP, Visual FoxPro, PL/SQL, T-SQL (Transact-sql), Perl, Peoplesoft SQR, Fortran, COBOL, Cold Fusion, Python, UNIX Shell Script, HP48, CA-Clipper, COAS Product Manager ...