Рельсы находят по нескольким моделям - PullRequest
0 голосов
/ 30 марта 2010

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

class User < ActiveRecord::Base
has_one :profile

class Profile < ActiveRecord::Base
has_one :user
belongs_to :team

У меня есть партиал, который просматривает пользователей и выводит некоторую основную информацию, я использую этот партиал на своей странице показа команды.

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

def show
@team = Team.find_by_id(params[:id])
@profiles= Profile.find(:all, :conditions => ['team_id = ?', @team.id])
@users = User.find_by_id(@profiles.user_id)
end

Но быстро понял, что @profiles - это массив, и он выглядит чертовски грязно. Застрял в том, как должна выглядеть моя находка, чтобы выбрать всех пользователей, чей профиль является членом команды.

Часть, которая работает в другом месте для отображения пользователей, выглядит следующим образом

<% for user in @users%>
<table>
<tr>
        <td>
        <%= image_tag user.profile.picture.url %>
        </td>
        <td>
        <a href="/users/<%= user.id %>"><%= user.login %></a>
        </td>
        <td>
        <%= user.profile.first_name %> <%= user.profile.second_name %>
        </td>
        <td>
        <%= user.profile.status %>
        </td>
</tr>
</table>
<% end %>

Вывод журнала разработки с обновленным шоу и связями

Processing TeamsController#show (for 127.0.0.1 at 2010-03-30 22:06:31) [GET]
  Parameters: {"id"=>"1"}
  User Load (1.3ms)   SELECT * FROM "users" WHERE ("users"."id" = 3) LIMIT 1
  Team Load (1.0ms)   SELECT * FROM "teams" WHERE ("teams"."id" = 1) 
Rendering template within layouts/main
Rendering teams/show
Completed in 75ms (View: 11, DB: 2) | 200 OK [http://localhost/teams/1]

Ответы [ 2 ]

4 голосов
/ 30 марта 2010

Я бы изменил ваши ассоциации на что-то вроде этого:

class User < ActiveRecord::Base
has_one :profile

class Profile < ActiveRecord::Base
belongs_to :user
belongs_to :team

class Team < ActiveRecord::Base
has_many :profiles
has_many :users, :through => :profiles

Я думаю, что проблема, с которой вы столкнулись, заключается в том, что в отношениях has_one нужно быть владельцем, а другим - владеть .. (own_to)

Тогда вы сможете найти ассоциации, используя следующее:

@user.profile
@team.users
@team.profiles

и т.д ..

Если вы хотите, чтобы у пользователя был профиль, а команда отображала его профили, измените модель на эту:

class User < ActiveRecord::Base
has_one :profile
belongs_to :team

class Profile < ActiveRecord::Base
belongs_to :user

class Team < ActiveRecord::Base
has_many :users
has_many :profiles, :through => :users

Таким образом, вы можете загрузить свою команду, ее пользователей и профили пользователей:

@team = Team.find(params[:id])
@users = @team.users
@profiles = @team.profiles

Удачи!

Для того, чтобы ваши ассоциации правильно работали с приведенным выше кодом, в ваших таблицах БД должно быть следующее:

Ваша таблица профилей должна содержать user_id в виде целого числа.

Ваша таблица пользователей должна иметь team_id в виде целого числа.

Вашему столу команд не нужны идентификаторы.

Убедитесь, что ваши миграции правильно настроили эти идентификаторы и что при создании пользователя он правильно связан с вашей командой:

@team.users << @user

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

1 голос
/ 30 марта 2010

Измените свою ассоциацию следующим образом:

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
  belongs_to :team
end

class Team < ActiveRecord::Base
  has_many :profiles
  has_many :users, :through => :profiles
end

Убедитесь, что в таблице profiles есть столбцы user_id и team_id.

Измените свой show метод следующим образом:

def show
  @team   = Team.find(params[:id])
  @profile= @team.profile
  @user   = @profile.user
end

PS:

Приведенный выше код будет работать, если у команды один профиль, а профиль принадлежит команде и пользователю.

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