标签: sequel

续集中的default_scope

在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)

ruby activerecord default-scope sequel

7
推荐指数
1
解决办法
2389
查看次数

续集 - 我可以在连接中对子查询进行别名吗?

使用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_itemsmy_users)

语法可能会采用这种形式

my_items.join(my_users, :id => :user_id).
  select{[ ... , ... ]}
Run Code Online (Sandbox Code Playgroud)

我将提供合格的列名来访问my_users.namemy_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)

似乎做对了.

ruby sql join subquery sequel

7
推荐指数
1
解决办法
4486
查看次数

如何在Sequel Postgresql迁移中定义ARRAY列?

我正在创建一个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[]迁移中的内容?

ruby database migration postgresql sequel

7
推荐指数
1
解决办法
2308
查看次数

使用UTC与续集?

我不想在我当地的时区存储时间,但是续集让我很难受.我可以在将它们放入那里之前将它们设置为UTC(有点痛苦),但是当我把它们取出时它假定它们是本地日期然后它们将来都是8小时.这件事还没有实现吗?如果是这样,有没有解决方法?谢谢!

ruby sequel

6
推荐指数
3
解决办法
3679
查看次数

如何设置续集模型中的默认值?

给定下面的代码,如何为模型定义默认值.(比方说,默认为: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.

ruby default model sequel

6
推荐指数
2
解决办法
6078
查看次数

数据库拉线程序期间的Heroku问题应用程序:Mysql ::错误MySQL服务器已经消失

尝试从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)

ruby mysql ruby-on-rails heroku sequel

6
推荐指数
2
解决办法
1789
查看次数

使用Sequel创建记录时,"续集::错误:id是受限制的主键"

我有一个基于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

ruby oracle sequel

6
推荐指数
1
解决办法
3469
查看次数

Sequel gem限定查询列名称,带有表双下划线

使用续集宝石:

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语句中限定员工条件,因为表使用标识符方法忽略下划线.

ruby sequel

6
推荐指数
1
解决办法
2470
查看次数

Ruby Sequel是否具有SQL"coalesce"功能的等效功能?

在SQL中为了避免获取NULL值,我可以使用"coalesce"函数来替换它,如下所示:

SELECT COALESCE(some_column, 0) FROM some_table;  
Run Code Online (Sandbox Code Playgroud)

但我找不到用Sequel做同样事情的方法.

coalesce sequel

6
推荐指数
1
解决办法
1286
查看次数

使用续集和数据库清理器的外键约束问题

我正在使用数据库清理器续集和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)

ruby sqlite sequel database-cleaner

6
推荐指数
1
解决办法
705
查看次数