我有一个属于妈妈和爸爸的孩子模特。
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
。有什么建议吗?
答案 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