ruby-on-rails – 是否可以使用内部连接条件delete_all?

我需要一次删除大量记录,我需要根据另一个与“belongs_to”关系相关的模型中的条件来执行此操作.我知道我可以遍历每个检查条件,但这需要我的大记录集永远,因为对于每个“belongs_to”它会进行单独的查询.

这是一个例子.我有一个“产品”模型,“belongs_to”是一个“艺术家”,并且假设艺术家有一个属性“is_disabled”.

如果我想删除所有属于残疾艺术家的产品,我希望能够做到这样的事情:

Product.delete_all(:joins => :artist,:conditions => ["artists.is_disabled = ?",true])

这可能吗?我以前直接在sql中完成了这个,但不确定是否可以通过rails完成.

解决方法

问题是delete_all会丢弃所有的连接信息(这是正确的).你想要做的是捕获它作为内部选择.

如果您正在使用Rails 3,您可以创建一个可以满足您需求的范围:

class Product < ActiveRecord::Base
  scope :with_disabled_artist,lambda {
    where("product_id IN (#{select("product_id").joins(:artist).where("artist.is_disabled = TRUE").to_sql})")
  }
end

查询电话然后成为

Product.with_disabled_artist.delete_all

您也可以使用相同的内联查询,但这不是很优雅(或自我记录):

Product.where("product_id IN (#{Product.select("product_id").joins(:artist).where("artist.is_disabled = TRUE").to_sql})").delete_all

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...