标签: arel

条件使用NOT NULL的Rails

使用rails 3样式我怎么写相反的:

Foo.includes(:bar).where(:bars=>{:id=>nil})
Run Code Online (Sandbox Code Playgroud)

我想找到id为非null的地方.我试过了:

Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Run Code Online (Sandbox Code Playgroud)

但那回归:

=> "SELECT     \"foos\".* FROM       \"foos\"  WHERE  (\"bars\".\"id\" = 1)"
Run Code Online (Sandbox Code Playgroud)

这绝对不是我需要的,而且几乎看起来像是ARel中的一个错误.

ruby-on-rails arel rails-activerecord

355
推荐指数
5
解决办法
23万
查看次数

想在Rails 3中找到没有相关记录的记录

考虑一个简单的关联......

class Person
   has_many :friends
end

class Friend
   belongs_to :person
end
Run Code Online (Sandbox Code Playgroud)

让所有在ARel和/或meta_where中没有朋友的人最简洁的方法是什么?

然后是一个has_many:通过版本

class Person
   has_many :contacts
   has_many :friends, :through => :contacts, :uniq => true
end

class Friend
   has_many :contacts
   has_many :people, :through => :contacts, :uniq => true
end

class Contact
   belongs_to :friend
   belongs_to :person
end
Run Code Online (Sandbox Code Playgroud)

我真的不想使用counter_cache - 而且我从我读过的内容中看起来并不适用于has_many:通过

我不想拉出所有的person.friends记录并在Ruby中循环它们 - 我希望有一个可以与meta_search gem一起使用的查询/范围

我不介意查询的性能成本

离实际的SQL越远越好......

ruby-on-rails arel meta-where

171
推荐指数
6
解决办法
6万
查看次数

合并两个ActiveRecord :: Relation对象

假设我有以下两个对象:

first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation  = User.where(:last_name  => 'Fünke') # ActiveRecord::Relation
Run Code Online (Sandbox Code Playgroud)

是否有可能将两个关系结合起来产生一个ActiveRecord::Relation包含两个条件的对象?

注意:我知道我可以链接这些行为来获得这种行为,我真正感兴趣的是我有两个独立的ActiveRecord::Relation对象.

ruby-on-rails arel rails-activerecord

165
推荐指数
7
解决办法
9万
查看次数

如何在Arel和Rails中进行LIKE查询?

我想做的事情如下:

SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Run Code Online (Sandbox Code Playgroud)

我在Arel的尝试:

# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Run Code Online (Sandbox Code Playgroud)

但是,这变为:

SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Run Code Online (Sandbox Code Playgroud)

Arel正确地包装查询字符串'Smith',但因为这是一个LIKE语句,所以它不起作用.

如何在Arel中进行LIKE查询?

PS奖金 - 我其实是想扫描桌子上两个字段,这两个名称和说明,看是否有查询的任意匹配.那会怎么样?

activerecord ruby-on-rails arel

111
推荐指数
2
解决办法
9万
查看次数

究竟什么是Rails 3.0中的Arel?

我知道它是ActiveRecord的替代品,它使用对象而不是查询.

但...

为什么这样更好?

对象/查询会"更容易"创建吗?

它会导致更高效的SQL查询吗?

它会与所有主要数据库兼容吗? - 我认为它会.

使用存储过程会更容易/更难吗?

ruby activerecord ruby-on-rails arel

85
推荐指数
2
解决办法
2万
查看次数

activerecord中的子查询

使用SQL,我可以轻松地执行这样的子查询

User.where(:id => Account.where(..).select(:user_id))
Run Code Online (Sandbox Code Playgroud)

这会产生:

SELECT * FROM users WHERE id IN (SELECT user_id FROM accounts WHERE ..)
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用rails'3 activerecord/arel/meta_where?

我确实需要/想要真正的子查询,没有ruby解决方法(使用多个查询).

subquery arel ruby-on-rails-3.1

78
推荐指数
3
解决办法
5万
查看次数

如何在Rails3中使用unscoped关联关系?

由于信息安全限制,我在产品上有默认范围.

class Product < ActiveRecord::Base
  has_many :photos

  default_scope where('visible = 1')
end
Run Code Online (Sandbox Code Playgroud)

但是,在我的相关照片模型中,我还必须找到不可见的产品.

class Photo < ActiveRecord::Base
  belongs_to :product
end

my_photo.product
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我可以使用unscoped来绕过default_scope,例如在Product.unscoped.find_by_title('abc').然而:

如何在使用记录关联时删除范围?

my_photo.unscoped.product因为my_photo没有调用方法,所以没有意义unscoped.也没有my_photo.product.unscoped任何意义,因为my_photo.product可能已经是零.

scope ruby-on-rails arel ruby-on-rails-3

62
推荐指数
5
解决办法
3万
查看次数

你如何在Rails 3中调整ActiveRecord关联的范围?

我有一个Rails 3项目.有了Rails 3,Arel就能够重用一个范围来构建另一个范围.我想知道在定义关系时是否有办法使用范围(例如"has_many").

我有记录,其中有权限列.我想构建一个default_scope,它将我的权限列考虑在内,以便过滤记录(甚至通过关系访问的记录).

目前,在Rails 3中,default_scope(包括我发现的补丁)没有提供传递proc的可行方法(我需要后期变量绑定).是否可以定义一个可以传递命名范围的has_many?

重用命名范围的想法如下:

Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders
Run Code Online (Sandbox Code Playgroud)

或隐式编码关系中命名范围的内容如下所示:

has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}
Run Code Online (Sandbox Code Playgroud)

我只是尝试将default_scope应用于后期绑定.我更喜欢使用Arel方法(如果有的话),但会使用任何可行的选项.

由于我指的是当前用户,因此我不能依赖于最后一刻未评估的条件,例如:

has_many :orders, :conditions => ["user_id = ?", User.current_user.id]
Run Code Online (Sandbox Code Playgroud)

activerecord named-scope ruby-on-rails arel ruby-on-rails-3

59
推荐指数
5
解决办法
8万
查看次数

ActiveRecord Arel OR条件

如何使用逻辑OR而不是AND组合2个不同的条件?

注意:作为轨道范围生成2个条件,并且不能轻易地将其更改为where("x or y")直接类似的条件.

简单的例子:

admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)
Run Code Online (Sandbox Code Playgroud)

它很容易应用和条件(对于这个特殊情况是没有意义的):

(admins.merge authors).to_sql
#=> select ... from ... where kind = 'admin' AND kind = 'author'
Run Code Online (Sandbox Code Playgroud)

但是,如何生成具有2种不同Arel关系的以下查询?

#=> select ... from ... where kind = 'admin' OR kind = 'author'
Run Code Online (Sandbox Code Playgroud)

似乎(根据Arel自述文件):

OR运算符尚不支持

但是我希望它不适用于此并期望写出如下内容:

(admins.or authors).to_sql
Run Code Online (Sandbox Code Playgroud)

ruby sql activerecord ruby-on-rails arel

58
推荐指数
4
解决办法
3万
查看次数

如何覆盖:has_many中定义的顺序

我有

class Authors 
has_many :books, :order => 'name ASC'
Run Code Online (Sandbox Code Playgroud)

我试图查询按名称DESC排序的所有书籍

Authors.books.order('name DESC')
Run Code Online (Sandbox Code Playgroud)

但结果是

SELECT * FROM .... ORDER BY name ASC, name DESC
Run Code Online (Sandbox Code Playgroud)

结果以名称排序ASC返回

有没有办法删除关联中的原始订单或覆盖它?或者在关系中指定一个坏主意的订单?

使用Rails 3.0.3

activerecord ruby-on-rails arel

42
推荐指数
2
解决办法
1万
查看次数