Попытка вызвать find_by_id для ActiveRecord :: Relation, исключение Arel - PullRequest
0 голосов
/ 07 июня 2011

Я разбираюсь с Rails 3, и я не могу сделать базовую находку из набора результатов.Мой код выглядит следующим образом:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).find_by_id(params[:id])

Я понимаю, что раздел "где" не будет возвращать коллекцию, а просто создаст запрос, который ожидает выполнения в БД.Однако я не могу понять, почему я получаю следующую ошибку при попытке запустить find_by_id:

undefined method `to_sql' for #<Arel::Attributes::String:0x106d9ecf0>

Может кто-нибудь указать, где я иду не так, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 08 июня 2011

Попробуйте это:

@project = @user.where({:projects => {:project_member_id => user.id}}).all.find {|p| p.id == params[:id]}
0 голосов
/ 07 июня 2011

Попробуй

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id]).first

Но я не понимаю, почему ты делаешь все это, когда у тебя есть первичный ключ с тобой .. Просто Model.find params[:id] мне кажется достаточно (полагаю, что-то еще).

0 голосов
/ 07 июня 2011

Я мог бы неправильно понять, что вы пытаетесь сделать здесь, но похоже, что у вас есть ассоциация под названием projects в пользовательской модели, верно?Если это так, то это намного проще (и работает):

@project = @user.projects.find params[:id]

Если у вас нет настройки связи, вам следует изучить их.Здесь есть замечательное руководство по рельсам .

Надеюсь, это поможет.

0 голосов
/ 07 июня 2011

Как вы упомянули выше, "where" возвращает объект ActiveRecord :: Relation, вы можете проверить его, выполнив:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).class

Чтобы вернуть коллекцию экземпляров объектов и запустить find, вы можете попытаться форсировать ее, выполнив что-то вроде:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).all.find_by_id(params[:id])

Метод любви в Rails!

Однако сначала будут найдены все проекты с переданным uesr.id (который может быть дорогостоящим и, вероятно, не тем, что вы хотите) ...

Удачи!

0 голосов
/ 07 июня 2011

Может быть, вы можете написать что-то вроде этого:

@project = 
   @user.where({:projects => {:project_member_id => user.id}}).where(:id => params[:id])

Я думаю, что это будет работать.

Alex.

...