是否可以使用内连接条件delete_all?

spi*_*ton 8 ruby-on-rails inner-join

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

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

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

Product.delete_all(:joins => :artist, :conditions => ["artists.is_disabled = ?", true])
Run Code Online (Sandbox Code Playgroud)

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

小智 4

问题是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
Run Code Online (Sandbox Code Playgroud)

你查询调用然后变成

Product.with_disabled_artist.delete_all
Run Code Online (Sandbox Code Playgroud)

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

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

  • 删除连接如何“正确”?通常需要连接条件来限制要删除的记录。我认为最糟糕的是它悄无声息地进行,这可能非常令人惊讶。 (2认同)