Ненормализованная связь с устаревшими таблицами в Rails и ActiveRecord - PullRequest
1 голос
/ 16 июня 2010

Я создаю приложение Rails для доступа к устаревшей системе. Модель данных содержит клиентов, которые могут иметь одну или несколько подписок. Подписка всегда принадлежит одному и только одному Заказчику. Хотя это и не нужно, эта ассоциация представлена ​​через объединяющую таблицу «подписки», в которой нет столбца идентификатора:

 Column          |  Type   | Modifiers
-----------------+---------+-----------
 customer_id     | integer | not null
 subscription_id | integer | not null

У меня это закодировано как декларации has_and_belongs_to_many в клиенте и подписке

class Customer < Activerecord::Base
  has_and_belongs_to_many :subscriptions, :join_table => "subscribes",
    :foreign_key => "customer_id", :association_foreign_key => "subscription_id"
end
class Subscription < Activerecord::Base
  has_and_belongs_to_many :customers, :join_table => "subscribes",
    :foreign_key => "subscription_id", :association_foreign_key => "customer_id"
end

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

Есть ли способ заставить ActiveRecord сделать это отношение 1 к N, даже если сама таблица соединения, по-видимому, делает это отношение N-к-М?

- Thomas

1 Ответ

1 голос
/ 17 июня 2010

Я не знаю, можете ли вы сделать это с помощью ActiveRecord, но если вы хотите какое-либо решение этой проблемы, вы можете определить метод customer для subscription модели:

class Subscription < Activerecord::Base
   has_and_belongs_to_many :customers, :join_table => "subscribes",
      :foreign_key => "subscription_id",
      :association_foreign_key => "customer_id"

   def customer
      self.customers.first
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...