0

我有一个优化问题。我搜索如何使用 ActiveRecord 请求获取 one_to_one 或 one_to_many 中没有任何链接的所有实体。

我有:

class Model1 < ActiveRecord::Base
  has_one :model2
  ...

class Model2 < ActiveRecord::Base
  belongs_to :model1
  ...

如果我想要所有model2s非链接的列表,我只需要这样做:

unlinked_model2s = Model2.where(:model1_id => nil)

但是我如何为model1s做同样的事情呢?我将拥有未链接到模型 2 的所有模型 1 的列表。

我尝试了很多东西,但使它起作用的唯一方法是对所有请求一一处理,这太可怕了:

unlinked_model1s = Array.new
Model1.all.each do |model1|
  unless model1.model2
    unlinked_model1s << model1
  end
end

感谢您的帮助!

4

1 回答 1

0

这将需要编写一些 SQL。默认情况下,AR 仅支持inner join,因此您不能使用Model1.joins(:model2).where(...).

看来你可以试试Model1.joins("left join model2s on (model2s.model1_id = model1s.id) ").where(:model2s => {:id => nil})

或者

Model1.joins("left join model2s on (model2s.model1_id = model1s.id) ").where("model2s.id is NULL")

不确定这在语法上是否正确(无法尝试代码:))正确,但希望这能让您了解如何完成任务。

于 2013-03-20T12:00:13.863 回答