ruby on rails-如何在不同的条件下查询同一个模型两次



我有一个Kid模型,属于爸爸妈妈。

class Kid
  belongs_to :mom
  belongs_to :dad 
end
class Mom
  has_many :kids
  has_many :dads, through: :kids
end
class Dad
  has_many :kids
  has_many :moms, through: :kids
end

现在,我正在做的是根据创建时间、年龄和与母亲的距离列出父亲的孩子。

def show
  @dad = Dad.find(params[:id])
    near = Mom.near(@user_location, 100, :select => "kids.*") # Geocoder gem
  @kids = @dad.kids.joins(:mom).merge(near).order(age: :asc, created_at: :desc).page(params[:page])
end

我在Mom模型上有一个布尔字段,叫做is_online。我希望这个领域能够做到这一点,这样结果就不会基于near方法或距离,在线妈妈们将处于领先地位。因此,分页的结果看起来像:

online kid, 2 years old
online kid, 3 years old
offline kid, 4 years old, 4 miles away
offline kid, 5 years old, 5 miles away

我的问题是,我不知道如何让我的孩子只是一个范围,所以我不必制作@online_kids@offline_kids。我只想保留为@kids。有什么建议吗?

所以你必须使用order子句,我想:

@kids = @dad.kids.joins(:mom).merge(mom).order('moms.is_online DESC, kids.age ASC, kids.created_at DESC').page(params[:page])

您以这种方式构建Mom查询,基于其他答案:

near = Mom.near(@user_location, 100, :select => "kids.*").where(is_online: false).where_values.reduce(:and)
online = Mom.where(is_online: true).where_values.reduce(:and)
mom = Mom.where(near.or(online))

您可以为在线和离线创建不同的范围,如下所示:

class Kid
  belongs_to :mom
  belongs_to :dad 
 scope :online,  lambda { where(:is_online => true) }
 scope :offline, lambda { where(:is_online => false) }
end

现在,您可以根据这些范围进一步筛选搜索结果。

例如

 kids = Kid.where(:age > 2)
 kids.online   # these will be online  kids
 kids.offline  # these will be offline kids

最新更新