2014-04-15 53 views
0

我有一个孩子模型,属于一个妈妈和爸爸。如何用不同的条件查询同一模型两次?

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 

我在名为is_online的Mom模型上有一个布尔字段。我希望这个领域能够做到这一点,所以结果将不会基于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。有什么建议么?

+0

这对我来说有点不清楚。你想让你的'@ kids'变量保持什么? –

+0

@MarekLipka我想让在线的孩子与离线的孩子在一起,所以只有1个范围是'@ kids'。我混淆了词的范围和查询,对不起。 – user2784630

+0

所以你现在拥有它('@ kids'拥有'在线'孩子和'离线'孩子)。你想如何改进它? –

回答

2

所以,你必须使用order条款,我想:

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

你建立你的Mom查询这种方式,立足other answer

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)) 
+0

嗯,我想你需要把'is_online'作为排序的第一列。 – Magnuss

+0

@Magnuss谢谢。这就是为什么我写我不记得我是否使用了良好的秩序。 –

+0

@MarekLipka因为我刚刚意识到我的设计缺陷,我实际上不得不改变我的问题。我正在使'is_online'属性与“妈妈”分开。所以,它将是'kid.mom.is_online'而不是'kid.is_online'。 – user2784630

0

您可以在线和离线创建不同的范围,像这样:

class Kid 
    belongs_to :mom 
    belongs_to :dad 

scope :online, lambda { where(:is_online => true) } 
scope :offline, lambda { where(:is_online => false) } 
end 

Now ,您可以按照这些范围进一步过滤搜索结果。

例如

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

我实际上不得不改变我的问题,因为我刚刚意识到我的设计缺陷。我正在使is_online属性与妈妈分开。所以,这将是kid.mom.is_online,而不是孩子。is_online – user2784630

+0

在这种情况下,您可以将这些范围转移到Mom类,这是否解决您的问题,或者您的问题是不同的。 – Saurabh

+0

@saurabh仔细阅读这个问题,你会知道它没有。 –

相关问题