Имеется ли значение has_many / through в таблице «многие ко многим через таблицу соединений»? - PullRequest
0 голосов
/ 10 марта 2011

У меня есть 3 модели: Клиенты, Магазины, Регистрация (список рассылки)

(Регистрации являются их собственным объектом, поскольку они имеют состояние, в котором включен, отключен, занесен в черный список и т. Д.)

Покупатели и магазины достаточно независимы и в настоящее время не имеют прямой связи друг с другом.

Однако мы добавляем конструкцию «список рассылки», регистрации:

Signup belongs_to :store AND :customer
Store has_many :signups 
Customer has_many :signups

Мне не ясно, при каких условиях мне нужно будет включить:

store has_many :customers, :through => :signups
customer has_many :stores, :through => :signups

Без: сквозного, когда store X отправляет широковещательную электронную почту в свой список рассылки, мы просто позволяем mail_list = Customers.signup.find (где store_id соответствует X)

Вопрос 1: есть ли проблемы с этим подходом?

Вопрос 2: если бы мы добавили: through, как бы выглядел запрос, чтобы получить всех покупателей, у которых есть «подписка» на текущий магазин?

Вопрос 3: если у нас было 3 или 3 разных совместных стола между покупателями и магазинами (например, заказы, счета, регистрация, дисконт-клубы), это создает какие-либо проблемы?

1 Ответ

0 голосов
/ 10 марта 2011

Вопрос 1: есть ли проблемы с этим подходом?

Пример, который вы привели, не сработает (не: сквозной подход), потому что, если у клиентов много регистраций,customer.signup будет доступно только для экземпляра клиента, но не для коллекции.Если бы вы не использовали таблицы соединений, вам пришлось бы либо перебирать большое количество данных, чтобы собрать все, либо написать некоторый sql, чтобы справиться с этим, что означает, что вы все равно используете таблицу объединения в любом случае, но неэффективно.

Вопрос 2: если бы мы добавили: through, как бы выглядел запрос, чтобы получить всех покупателей, у которых есть «подписка» на текущий магазин?

store.customers сгенерирует что-нибудь по следующему принципу:

SELECT `customers`.* FROM `customers` INNER JOIN `signups` ON `customers`.id = `signups`.customer_id WHERE ((`signups`.store_id = 1))

Вопрос 3: если бы у нас было 3 или 3 разных объединенных стола между покупателями и магазинами (например, заказы, счета, регистрации, дисконт-клубы)это представляет проблему?

Нет, это не должно быть проблемой.Это подходящий день, чтобы иметь дело с такими отношениями (ну, может быть, не с заказами и счетами, если они не являются общими для нескольких клиентов или что-то в этом роде).Просто убедитесь, что вы поместили индексы в нужные столбцы.

...