使用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中的一个错误.
考虑一个简单的关联......
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越远越好......
假设我有以下两个对象:
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对象.
我想做的事情如下:
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的替代品,它使用对象而不是查询.
但...
为什么这样更好?
对象/查询会"更容易"创建吗?
它会导致更高效的SQL查询吗?
它会与所有主要数据库兼容吗? - 我认为它会.
使用存储过程会更容易/更难吗?
使用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解决方法(使用多个查询).
由于信息安全限制,我在产品上有默认范围.
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可能已经是零.
我有一个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) 如何使用逻辑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) 我有
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