activerecord найти условия для связанных моделей - PullRequest
1 голос
/ 19 сентября 2010

, поэтому я не нашел много документации об использовании условий в методах поиска 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'"

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

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

Ответы [ 2 ]

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

вместо

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

try

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

user s

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

Стандартный формат Rails для имен таблиц в самой базе данных - «все строчные, множественное число».

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

no such column: user.login

Поскольку мы знаем, что имя таблицы - "пользователи", проблема в том, что вы ссылаетесь на таблицу "пользователь"

Исправление зависит от версии Active Record. Я предпочитаю old school, так как он делает более ясным, что условным условием является SQL, а не Ruby / Rails:

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

Примечание. Рельсы 3 отличаются от описанных выше ...

Добавлено:

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

user_login = "admin"  # or, for example, params['user']
Avatar.find(:all, :include => :user,
  :conditions => ["users.login = ?", user_login])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...