如何在不同条件下两次查询同一模型?

时间:2014-04-15 09:32:59

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个属于妈妈和爸爸的孩子模特。

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。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

other answer为基础,以这种方式构建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))

答案 1 :(得分:0)

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

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