rails获取没有很多关系的记录和有条件的记录

时间:2016-02-16 10:05:20

标签: ruby-on-rails postgresql rails-activerecord

我有HomeMakerPerDateUnavailability型号。 HomeMaker has_many per_date_unavailabilities。我想要所有没有per_date_unavailacilities记录的家庭制造商和有记录的家庭制造商,但不是per_date_unavailabilties.unavailable_date = somedate

当我想要使用HomeMaker.includes(:per_date_unavailabilities).where(per_date_unavailabilities: {id: nil})没有PerDateUnavailability记录的HomeMakers时,我通常会做第一部分

使用HomeMaker.joins(:per_date_unavailabilities).where.not(per_date_unavailabilities: {unavailable_date: Date.today})

的条件的第二部分

如何混合这些?

1 个答案:

答案 0 :(得分:0)

你需要的sql有点像这样:

select a.*
  from home_makers a left join per_date_unavailabilities b
  on a.id = b.home_maker_id
  where b.home_maker_id is NULL
  or b.unavailable_date IS NOT ?;

在ActiveRecord中表达or子句有点困难,我们最好不要对抗它。 (在OP评论后编辑)

HomeMaker.joins("LEFT JOIN per_date_unavailabilities on per_date_unavailabilities.home_maker_id = home_makers.id")
.where("per_date_unavailabilities.home_maker_id IS NULL OR per_date_unavailabilities.unavailable_date != ?", somedate)