Ruby 从活动记录中的两个可接合表中检索对象
我有一种情况,我有一个SQL表,它几乎是“父母”其他人的。 在下面的示例中,最容易想象有不同类型的客户机(需要存储不同的数据字段)都具有唯一的客户机IDRuby 从活动记录中的两个可接合表中检索对象,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
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 %>