Ruby 从活动记录中的两个可接合表中检索对象

Ruby 从活动记录中的两个可接合表中检索对象,ruby,postgresql,activerecord,Ruby,Postgresql,Activerecord,我有一种情况,我有一个SQL表,它几乎是“父母”其他人的。 在下面的示例中,最容易想象有不同类型的客户机(需要存储不同的数据字段)都具有唯一的客户机ID CREATE TABLE clients ( id serial NOT NULL, internal_ref character varying, address character varying, telephone_no character varying, CONSTRAINT pkey_clients PRIMA

我有一种情况,我有一个SQL表,它几乎是“父母”其他人的。 在下面的示例中,最容易想象有不同类型的客户机(需要存储不同的数据字段)都具有唯一的客户机ID

CREATE TABLE clients (
  id serial NOT NULL,
  internal_ref character varying,
  address character varying,
  telephone_no character varying,
  CONSTRAINT pkey_clients PRIMARY KEY (id),
  CONSTRAINT uniq_clients_internal_ref UNIQUE (internal_ref)
)

CREATE TABLE partnerships (
  id serial NOT NULL,
  clients_id integer,
  name character varying,
  CONSTRAINT pkey_partnerships PRIMARY KEY (id),
  CONSTRAINT fkey_partnerships_clients_id FOREIGN KEY (clients_id)
    REFERENCES clients(id) MATCH FULL
      ON UPDATE NO ACTION
      ON DELETE NO ACTION
)

CREATE TABLE individuals (
  id serial NOT NULL,
  clients_id integer,
  forename character varying,
  surname character varying,
  CONSTRAINT pkey_individuals PRIMARY KEY (id),
  CONSTRAINT fkey_individuals_clients_id FOREIGN KEY (clients_id)
    REFERENCES clients(id) MATCH FULL
      ON UPDATE NO ACTION
      ON DELETE NO ACTION
)
我是Active Record的新手,不确定如何(或是否)优雅地实现它,以便找到业务并获得加入的客户数据

目前我正在尝试:

class Client < ActiveRecord::Base
end
class Partnership < ActiveRecord::Base
  has_one :clients
end

output = Partnership.find(:all) # I only have one row in both tables, which is also joinable
p output # => [#<Partnership id: 1, name: "PART1", clients_id: 1>]
class客户端[#]
我需要
输出
也有可连接的数据,如
内部参考
地址
等。我怎么做?

简单。您的“子”模型
属于
“父”模型,该模型可以
有一个
有多个
“子”

型号:

# app/models/client.rb
class Client < ActiveRecord::Base
  has_one :partnership
  has_one :individual
end

# app/models/pertnership.rb
class Partnership < ActiveRecord::Base
  belongs_to :client
end

# app/models/individual.rb
class Individual < ActiveRecord::Base
  belongs_to :client
end
如果您不想在每次尝试访问您使用的客户端时进行额外查询,请执行以下操作:

@output = Partnerships.includes(:client).all
或通过客户机和个人进行即时加载:

@output = Partnerships.includes(:client => :individual ).all
然后,在您的视图中,您可以轻松地访问被引用的客户端,甚至可以访问客户端中被引用的个人

<% @output.each do |partnership| %>
  <%= partneship.client.internal_ref %>
  <%= partneship.client.address %>
  <%= partneship.client.individual.forname %>
<% end %>


谢谢。我还不能测试这个。假设它有效,我以后会接受的。我对
有点好奇。这是ERB视图语法。我假设您正在使用Rails,因为您想使用ActiveRecord。您可以用几乎相同的方法在控制台中编写@output,只需松开
。我尝试了这个方法,但由于任何原因,都无法让它返回
partnership.client的客户端部分。您的回答帮助我更好地理解了Active Record,但经过进一步调查,我发现AR似乎不支持我想要的方式(或者至少没有足够的文档可供我使用),所以我只使用一个表继承,正如中所讨论的,我已经用快速脏代码演示更新了答案。看看吧。谢谢你的持续努力。这很有效。作为澄清,客户机可能只链接到合作伙伴或个人(他们是客户的类型)-我能够调整脚本以模拟该场景。我想我现在会走“单表继承”的路线(它与我在应用程序中所做的其他事情配合得很好),但这种方法在大多数情况下可能会更好。
<% @output.each do |partnership| %>
  <%= partneship.client.internal_ref %>
  <%= partneship.client.address %>
  <%= partneship.client.individual.forname %>
<% end %>