Как мне использовать hash: условие для .find для nil?метод в Rails (отношение has_one) - PullRequest
2 голосов
/ 28 сентября 2010

Я хочу найти все контакты, для которых значение их отношения: has_one с: contact_status не имеет значения (означает ли это ноль?)

Я создал alias_attribute :status, :status_contact

Могу ли я сделать что-то вроде:

contacts = Contact.find(:all, :conditions => {:contact_status => nil }, :include => {:status_contact} )

Я не совсем уверен, как работает ноль.По сути, я не присваиваю ему никакого значения, это просто отношение: has_one.

РЕДАКТИРОВАТЬ: похоже, что контакты должны быть отношением own_to, поэтому вносим изменения Из комментариев этоЗвучит так, что Контакты должны на самом деле иметь отношение принадлежать к status_contacts, которое, в свою очередь, 'has_one' с Контактами.

Я использую Searchlogic для создания named_scopes ... Я думаю, это решает проблему, любойзнакомы с этим?

Однако бывают случаи, когда пользователь может присвоить этому значение.Я не хочу, чтобы они появлялись в поиске.

В настоящее время появляется эта ошибка:

SQLite3 :: SQLException: near ".": Синтаксическая ошибка: ВЫБЕРИТЕ "contacts". "Id"AS t0_r0," contacts "." First_name "AS t0_r1," contacts "." Last_name "AS t0_r2," contacts "." Title "AS t0_r3," contacts "." Phone "AS t0_r4," contacts "." Fax"AS t0_r5," контакты "." Электронная почта "AS t0_r6," контакты "." Компания "AS t0_r7," контакты "." Made_at "AS t0 _r8," контакты "." Updated_at "AS t0_r9," контакты "."Кампания_id "AS t0_r10," контакты "." date_entered "AS t0_ r11," контакты "." company_id "AS t0_r12," контакты "." address_id "AS t0_r13," контакты "." vcard_file_name "AS t0_r14," контакты "."vcard_content_type" AS t0_r15, "contacts". "vcard_file_size" AS t0_r16, "contacts". "vcar d_updated_at" AS t0_r17, "contacts". "direct" AS t0_r18, "contacts". "sugarcrm" AS t0_r19, "status_contacts","id" AS t1_r0, "status_contacts". "status" AS t1_r1, "status_contacts". "contact_id" AS t1_r2, "status_contac ts". "made_at" AS t1_r3, "status_contacts". "updated_at" AS t1_r4 ОТ "контактов"ВЛЕВО НАРУЖНОЕ СОЕДИНЕНИЕ "status _contacts" ON status_contacts.contact_id = contacts.id WHERE (: status_contact.status = NULL)

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

Ваша ошибка не соответствует коду, который вы показываете.Я предполагаю, что вы делаете что-то вроде

:conditions => ['status = ?', nil]

, но вы должны проверять не status, который является связанным объектом.Это то, как вы бы проверяли это в ruby-коде, но не в sql.

Внутри вашей таблицы у вас было бы поле с именем status_contact_id, и когда это поле равно NULL (база данных эквивалентнаnil) тогда это не имеет отношения.

Так что вам действительно нужно сделать что-то вроде

contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")

[EDIT] Поскольку вы используете отношение has_one, полностью перечитайтечто внешний ключ действительно определен в таблице status_contacts.Но запрос к элементам, не имеющим никаких status_contacts, становится немного более сложным.

В sql вы бы сделали что-то вроде

select * from contacts where id not in (select contact_id from status_contacts)

, и я бы перевел это на ruby ​​следующим образом:

contacts = Contacts.find_by_sql("select * from contacts where id not in (select contact_id from status_contacts)"

Лично я не могу сейчас придумать лучшего способа.

1 голос
/ 28 сентября 2010

try

contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")

при условии, что ваш столбец fk равен contacts.status_contact_id

UPDATE: nathanvda верен;Кроме того, я думаю, что вы можете сделать это без find_by_sql - untested ...

contacts = Contact.find(:all, 
    :conditions => "contacts.id NOT IN (select contact_id from status_contacts)"   
)

ПРИМЕЧАНИЕ: Я все еще думаю, что вы действительно хотите использовать Contact with own_to:status_contact

0 голосов
/ 28 сентября 2010

Зависит от версии Rails, я в основном работаю в 2.3.5, но я считаю, что «условия» в этом контексте означают «SQL-подобный фрагмент».

Обычно вы делаете что-то вроде

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil])

Кроме того, nil в Ruby означает полностью лишенный значения. Это ничего не хранит. [], пустой массив, вернет false, если вы отправите ему сообщение nil?, однако оно ответит true на сообщение empty?.

...