Rails: найдите запись has_one, в которой ее нет - PullRequest
7 голосов
/ 08 апреля 2011

Итак, у меня есть приложение с двумя моделями.Foo has_one Bar, Bar принадлежит_to Foo.

Теперь, чтобы создать Foo, вам нужно создать Bar, чтобы принадлежать ему, но похоже, что-то проскользнуло через трещины, потому что в моем производственном приложении я теперь выгляжуиметь один Foo, который каким-то образом был создан без Bar, и это вызывает ошибку 500.

Теперь вот проблема:

Я могу искать: Bar.where(:foo=>nil) очень хорошо.Но сиротские бары не проблема, и это не говорит мне, что мне нужно.

Мне нужно найти тот Foo, где Bar равен нулю.Но база данных хранит отношения в таблице Bars, т. Е. В BarsTable есть foo_id, в FoosTable нет ничего, что могло бы сказать, что в ней отсутствует бар.

Когда я использую Foo.find(#).bar, я получу ноль дляодна фиктивная запись, но у меня есть много записей.

Итак, кто-нибудь может сказать мне, как построить запрос, который бы возвратил тот Foo, который отсутствует, это Bar?

Спасибо !!

Ответы [ 2 ]

7 голосов
/ 08 апреля 2011

Я не уверен, каким будет код Ruby, но я думаю, что SQL должен выглядеть примерно так:

ВЫБРАТЬ * ИЗ Foo, ГДЕ НЕ ВХОДИТ (ВЫБЕРИТЕ foo_id ИЗ СТОРОНА)

2 голосов
/ 08 апреля 2011

Другим способом (без использования SQL) было бы сделать что-то вроде:

Foo.all.select {| f | ! f.bar}

Это вернуло бы массив объектов Foo, у которых нет связанного объекта Bar.

В этом методе вы не полагаетесь на конкретную информацию таблицы. Если бы столбец foreign_key изменился в будущем Foo -> Bar Ассоциации, этот метод продолжал бы работать.

...