我有一个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