0

我正在为会员数据库做一个应用程序。

每个人都可能有一个伴侣。在显示列表时,我只想为每个家庭设置一行,所以目前我正在比较名字,如果该人的名字排在第二位,则不显示该行。像这样

person.first_name != [person.first_name, person.partner.first_name].sort[0]

这意味着每个家庭只显示一次,而不是两次 - 每个合作伙伴一次。

我正在视图中执行此操作。

必须有更好的方法来做到这一点,如果我能在数据库级别做到这一点,那就太好了。如果这有所作为,我正在使用 postgresql。

编辑


抱歉,如果不清楚。

假设第 1 个人的名字为“Edward”,第 2 个人的名字为“Fay”。爱德华和费伊结婚了。

我只想在我的列表中显示一次 - 我希望一行看起来像这样

Surname     First name    Address    etc
Mysurname   Edward        ....
            Fay               

我不想先用 Fay 再次显示它,因为我在人员列表中同时拥有 Fay 和 Edward,所以我在问题的第一部分使用 ruby​​ 来检查我是否应该显示该行 - 它比较了他们名字,并且仅当该人的名字在他/她的伴侣的名字之前时才执行该行。

这是我的人模型的相关部分

class Person < ActiveRecord::Base

  has_one :relationship_link,  :foreign_key => :person_id, :dependent => :destroy, :include => :partner
  has_one :partner, :through => :relationship_link, :source => :person_b, :class_name => "Person"

我希望这更清楚

4

2 回答 2

0

对于这种情况,我将创建一个数据结构(哈希)来存储给定特定姓氏的人员实例。像这样的东西:

def build_surnames_hash(people_array)
  surnames_hash = {}
  people_array.each do |person|
    last_name = person.last_name
    surnames_hash[last_name] ||= []
    surnames_hash[last_name] << person
  end
  surnames_hash
end

这样,您可以遍历哈希并使用存储为哈希键的姓氏显示人员:

surnames_hash = build_surnames_hash(Person.all)

surnames_hash.each do |surname, person_instances_array|
  # display the surname once
  # iterate over person_instances_array displaying their properties
end
于 2012-11-09T13:19:15.293 回答
0

您需要使用DISTINCT ONGROUP BY。在 postgres 中,您需要小心按您选择的所有内容进行分组。如果您只需要获取姓氏即可select("DISTINCT ON(last_name) last_name").pluck("last_name")。不过,您只会得到一组姓氏。

如果您按表中的所有其他字段排序,也许您可​​以获得记录,如下所示:

select("DISTINCT ON(people.last_name) people.*").order("people.last_name ASC, people.first_name ASC, people.field2 DESC, people.field3 ASC...")

您需要按每个属性排序,这样结果才不会模棱两可。

于 2012-11-09T12:40:28.470 回答