在ActiveRecord中,有一个default_scope类方法来指定默认范围.例如
class User < ActiveRecord::Base
default_scope where(:deleted => false)
end
User.all # => SELECT * FROM users WHERE deleted = 0;
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做Sequel::Model?
编辑:
经过一些谷歌搜索后,我终于找到了一些有用的信息.
class User < Sequel::Model
# Define some "scopes" (filters on the dataset)
dataset_module do
def existing
filter(deleted: false)
end
def active
filter(disabled: false)
end
end
# This is the equivalent to a default_scope. Set one of the datasets
# as the default dataset for this model.
set_dataset(self.active)
end
Run Code Online (Sandbox Code Playgroud)
生成的查询如下所示:
User.all # => …Run Code Online (Sandbox Code Playgroud) 使用Sequel我想将两个子查询连接在一起,共享一些列名,然后在select中对这些列进行表限定.
如果两个数据集只是表格,我理解如何做到这一点.例如,如果我有一个users表和一个items表,包含属于用户的项目,我想列出项目的名称及其所有者的名称:
@db[:items].join(:users, :id => :user_id).
select{[items__name, users__name.as(user_name)]}
Run Code Online (Sandbox Code Playgroud)
产生
SELECT "items"."name", "users"."name" AS "user_name"
FROM "items"
INNER JOIN "users" ON ("users"."id" = "items"."user_id")
Run Code Online (Sandbox Code Playgroud)
如预期的.
不过,我不确定如何做到这一点,如果我参加代表的子查询(叫他们两个任意的数据集my_items和my_users)
语法可能会采用这种形式
my_items.join(my_users, :id => :user_id).
select{[ ... , ... ]}
Run Code Online (Sandbox Code Playgroud)
我将提供合格的列名来访问my_users.name和my_items.name.这样做的合适语法是什么?
的部分解决方案是使用t1__name的第一个参数,因为它似乎是提供给加入该数据集的别名有t1,t2等,但并不能帮助我晋级的项目名称,这是我需要提供的第二个参数.
我认为最理想的解决方案将使我能够为连接中的数据集提供别名,例如,如下所示(当然,由于多种原因,这不起作用)
my_items.as(alias1).join(my_users.as(alias2), :id => :user_id).
select{[alias1__name, alias2__name ]}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
谢谢!
更新
我认为from_self让我成为那里的一部分,例如
my_items.from_self(:alias => :alias1).join(my_users, :id => :user_id).
select{[alias1__name, t1__name]}
Run Code Online (Sandbox Code Playgroud)
似乎做对了.
我正在创建一个Sequel迁移来在我的PostgreSQL数据库中创建一个新表.我想定义一个PostgreSQL支持的String数组列.
我的迁移看起来像这样:
create_table :venues do
primary_key :id
String :reference , :null => false
String :name , :null => false
String :description , :null => false
String[] :type , :null => false
DateTime :created_at , :null => false
DateTime :updated_at , :null => false
end
Run Code Online (Sandbox Code Playgroud)
如何定义text[]迁移中的内容?
我不想在我当地的时区存储时间,但是续集让我很难受.我可以在将它们放入那里之前将它们设置为UTC(有点痛苦),但是当我把它们取出时它假定它们是本地日期然后它们将来都是8小时.这件事还没有实现吗?如果是这样,有没有解决方法?谢谢!
给定下面的代码,如何为模型定义默认值.(比方说,默认为:name应为'Thing').
require 'pp'
require 'sequel'
DB = Sequel.sqlite
DB.create_table :items do
primary_key :id
String :name
end
items = DB[ :items ]
class Item < Sequel::Model
end
Item.create :name => 'foobar'
Item.create
pp Item.all
# =>
# >> [#<Item @values={:name=>"foobar", :id=>1}>,
# >> #<Item @values={:name=>nil, :id=>2}>]
Run Code Online (Sandbox Code Playgroud)
所以,我想将第二个创建的Item设置为#<Item @values = {:name =>"Thing",:id => 2}>而不是:name => nil.
尝试从Heroku中提取数据库会在整个过程中产生错误(如下所示).
使用:雪豹; Heroku的-1.8.2; 水龙头-0.2.26; Rails的2.3.5; MYSQL-42年5月1日.从错误消息中可以看出,数据库很小.
Heroku技术支持说它在我的系统上是一个问题,但没有提供如何解决它的方法.
我之前见过这个问题 - 例如这里.我怎样才能解决这个问题?
错误:
$ heroku db:pull
Auto-detected local database: mysql://[...]@localhost/[...]?encoding=utf8
Receiving schema
Receiving data
17 tables, 9,609 records
[...]
/Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:166:in `query': Mysql::Error MySQL server has gone away (Sequel::DatabaseError)
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:166:in `_execute'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:125:in `execute'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/connection_pool.rb:101:in `hold'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/database.rb:461:in `synchronize'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:125:in `execute'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/database.rb:296:in `execute_dui'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/dataset.rb:276:in `execute_dui'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:365:in `execute_dui'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/dataset/convenience.rb:126:in `import'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/dataset/convenience.rb:126:in `each'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/dataset/convenience.rb:126:in `import'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/adapters/mysql.rb:144:in `transaction'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/connection_pool.rb:108:in `hold'
from /Library/Ruby/Gems/1.8/gems/sequel-3.0.0/lib/sequel/database.rb:461:in `synchronize' …Run Code Online (Sandbox Code Playgroud) 我有一个基于Sequel和Oracle适配器的模型:
class Operation < Sequel::Model(DB[:operations])
end
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用Oracle的sequence.nextval作为主键创建记录:
Operation.create(
:id=>:nextval.qualify(:Soperations),
:payee_id=>12345,
:type=>"operation",
:origin=>"user-12345",
:parameters=>{}.to_s
)
Run Code Online (Sandbox Code Playgroud)
我有错误:Sequel::Error: id is a restricted primary key.在这种情况下创建记录或将Oracle的序列"映射"到id列的正确方法是什么?或许,我必须使用unrestrict_primary_key?
使用续集宝石:
employees = DB[:prm_master__employee.identifier]
.join(:prm_master__employee_custom_fields.identifier, :employee => :employee)
.where("termination_date >= ?","06/01/2012")
.or("termination_date = NULL")
.and("employee = 'holderl'")
Run Code Online (Sandbox Code Playgroud)
以上失败的原因是:
~/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/sequel-3.41.0/lib/sequel/adapters/tinytds.rb:221:in `fields': TinyTds::Error: Ambiguous column name 'employee'. (Sequel::DatabaseError)
Run Code Online (Sandbox Code Playgroud)
我理解错误(连接表之间的列名相同,例如员工),但不知道如何在and语句中限定员工条件,因为表使用标识符方法忽略下划线.
在SQL中为了避免获取NULL值,我可以使用"coalesce"函数来替换它,如下所示:
SELECT COALESCE(some_column, 0) FROM some_table;
Run Code Online (Sandbox Code Playgroud)
但我找不到用Sequel做同样事情的方法.
我正在使用数据库清理器与续集和sqlite外键约束遇到问题.具体来说,我正在使用:truncationCapybara集成测试的策略.
对于给定的示例模式:
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE events(id INTEGER PRIMARY KEY, title TEXT);
CREATE TABLE events_users(
user_id INTEGER,
event_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(event_id) REFERENCES events(id)
);
Run Code Online (Sandbox Code Playgroud)
和续集模特:
class User < Sequel::Model
many_to_many :events
end
class Event < Sequel::Model
many_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
运行以下内容:
# normally this would be run in
# an rspec before(:each) for my :feature specs
DatabaseCleaner.start
DatabaseCleaner.strategy = :truncation
bob = User.create(name: "bob")
sally …Run Code Online (Sandbox Code Playgroud)