Если Project.find (8) .users работает в моей Rails Console, как мне заставить его работать внутри моего приложения Rails 3? - PullRequest
0 голосов
/ 09 января 2011

Поэтому, когда я делаю Project.find(8).users, он возвращает всех пользователей, связанных с этим проектом ... в консоли.

Однако, когда я делаю:

<%= current_user.projects.Users.count %> выдает ошибку.

Как мне перейти с Rails Console на реальное приложение, с точки зрения синтаксиса здесь?

Ответы [ 5 ]

3 голосов
/ 10 января 2011
current_user.projects.sum { |p| p.users.count - 1 }

Возвращает общее количество пользователей, связанных с проектами, с которыми он связан, минус 1 по каждому проекту для удаления текущего пользователя.

2 голосов
/ 09 января 2011

Ваша проблема в том, что find возвращает запись, с которой вы можете получить доступ к ассоциации пользователей. Но вы не можете сделать это с has_many связью, потому что созданный метод доступа возвращает массив.

Project.find(8)       # => #<Project>
current_user.projects # => [#<Project>]

Вы должны выбрать один проект в возвращенном массиве или использовать map, чтобы получить всех пользователей каждого проекта.

1 голос
/ 10 января 2011

Я должен добавить, для потомков, что если вы используете таблицу соединений HABTM и хотите выполнять такую ​​работу, вы действительно должны использовать SQL.Примерно так:

User.find_by_sql "SELECT count(*) from projects_users WHERE user_id != #{current_user.id} AND project_id IN (SELECT DISTINCT project_id from projects_users WHERE user_id = #{current_user.id})"

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

1 голос
/ 09 января 2011

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

          @users =  Project.find(8).users

и, по вашему мнению, вы можете использовать @users так, как вам нравится. Например,

<p><%= pluralize(<@users.size,'user')%> Found<p>
<table>
   <tr>
       <th>Name</th>   
       <th>Surname</th>
       <th>Username</th>
   </tr>
   <% @users.each do |user|%>     
   <tr>
      <td><%= user.name%></td>
      <td><%= user.surname%></td>    
      <td><%= user.username%></td>   
   </tr>
   <%end%>  
</table>

Убедитесь, что в модели вашего проекта определено отношение has_may.

** Я привык использовать размер с моими массивами ... но count тоже это делает:)

0 голосов
/ 09 января 2011

Для тех, кто заинтересован в ответе, мне пришлось сделать следующее:

<%= current_user.projects.inject(0){|sum,p| sum+= (p.users.count-1); sum} %>

Возвращает количество пользователей, связанных с текущим проектом, за вычетом текущего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...