2010-09-19 5 views
1

поэтому я havent нашел много документации об использовании условий на activerecord, чтобы найти методы для связанных моделей, но я нашел множество примеров. хотя никто из них, похоже, не работает для меня.activerecord найти условия для связанных моделей

user has_one avatar 
avatar belongs_to user 

Avatar.find(:all, :include => :user, :conditions => {:user => {:login => 'admin'}}) 

возвращает смехотворно долго ошибка

SQLite3::SQLException: no such column: user.login: SELECT "avatars"."id" AS t0_r0, "avatars"."user_id" AS t0_r1, "avatars"."featured" AS t0_r2, "avatars"."avatar_file_name" AS t0_r3, "avatars"."avatar_content_type" AS t0_r4, "avatars"."avatar_file_size" AS t0_r5, "avatars"."created_at" AS t0_r6, "avatars"."updated_at" AS t0_r7, "users"."id" AS t1_r0, "users"."login" AS t1_r1, "users"."email" AS t1_r2, "users"."crypted_password" AS t1_r3, "users"."password_salt" AS t1_r4, "users"."persistence_token" AS t1_r5, "users"."perishable_token" AS t1_r6, "users"."login_count" AS t1_r7, "users"."failed_login_count" AS t1_r8, "users"."last_request_at" AS t1_r9, "users"."current_login_at" AS t1_r10, "users"."last_login_at" AS t1_r11, "users"."current_login_ip" AS t1_r12, "users"."last_login_ip" AS t1_r13, "users"."created_at" AS t1_r14, "users"."updated_at" AS t1_r15 FROM "avatars" LEFT OUTER JOIN "users" ON "users".id = "avatars".user_id WHERE ("user"."login" = 'admin') 

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

:conditions => "user.login == 'admin'" 

, но ничего не работает.

это приложение с рельсами 2.3.8, но также установлено rails3. поэтому у меня есть activerecord 3.0.0 & 2.3.8 установлен. Я думал, что это может быть проблемой, но это кажется маловероятным.

+0

Есть ли у пользователя поле под названием login? – 2010-09-19 18:33:09

+0

не забудьте найти полезные ответы и проверить ответ, который наилучшим образом отвечает на ваш вопрос. –

ответ

2

вместо

:user => {:login => 'admin'} 

попробовать

:users => {:login => 'admin'} 

пользователя сек

1

Стандартный формат Рельсы для имен таблиц в самой базе данных "в нижнем регистре, во множественном числе."

Таким образом, вы можете отлаживать ошибку SQL и посмотреть:

no such column: user.login 

Так как мы знаем имя таблицы «пользователи» проблема заключается в том, что вы ссылку таблицы «пользователь»

Fix зависит от версии Active Record. Я предпочитаю старую школу, так как это делает его более ясным, что положение условие SQL, не Руби/Rails:

Avatar.find(:all, :include => :user, 
    :conditions => "users.login = 'admin'") 

Примечание: Rails 3 отличается от выше ...

Добавлено:

Помните, что если вы ищете логин, указанный в качестве параметра от пользователя, вы должны должен правильно избежать этого параметра. Rails упрощает:

user_login = "admin" # or, for example, params['user'] 
Avatar.find(:all, :include => :user, 
    :conditions => ["users.login = ?", user_login]) 
+0

geez louise ... это сработал. спасибо larry (и gertas)! это здорово, когда решения настолько просты, но это действительно заставляет меня чувствовать себя толстой! – brewster

+0

Логин, как представляется, является переменным в исходном запросе brewster, но ваш пример может стимулировать SQL-инъекцию. Просветите пример. – gertas

+0

@ Gertas: Я прочитал его пример как ищущий уникальный логин «admin». users.login is table_name.field_name Но я согласен с вашей точкой зрения на использование самых безопасных примеров, так как небезопасно делать предположения о SO. Я обновил этот пример. –

Смежные вопросы