Получение объекта из двух объединяемых таблиц в Active Record - PullRequest
1 голос
/ 05 марта 2012

У меня есть ситуация, когда у меня есть таблица SQL, которая в значительной степени «родительская» для других.Проще всего представить в приведенном ниже примере, где есть разные типы клиентов (которым необходимо хранить разные поля данных), которые имеют уникальный идентификатор клиента.

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Запишите и не знаете, как (или если) я могу элегантно реализовать его, чтобы найти компанию и получить данные о присоединенном клиенте.

В настоящее время я пытаюсь:

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>]

Мне нужно output, чтобы также иметь присоединяемые данные, такие как internal_ref, address и т. Д. Как я могу это сделать?

1 Ответ

3 голосов
/ 05 марта 2012

Легко.Ваши "дочерние" модели belongs_to "родительские" модели, которые могут has_one или has_many "дети"

Модели:

# 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.all

Если вы не хотите делать дополнительный запрос каждый раз, когда пытаетесь получить доступ к клиенту, вы используете готовую загрузку:

@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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...