2010-03-30 3 views
0

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

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="https://stackoverflow.com/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] 

ответ

4

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

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 

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что в га s_one отношения один должен быть владелец и один должен быть ownee .. (belongs_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 

Надежда, что помогает!

+0

Он, кажется, не правильно выбирает пользователей, хотя кажется, что имеет смысл, когда я работал над ним на бумаге. Добавлен журнал и частичный – Kelvin

+0

KGB Убедитесь, что все ваши ассоциации установлены правильно? Пока ваши пользователи связаны с вашей командой, они должны работать. Я добавлю, как выглядит ваша структура таблицы. –

+0

К сожалению, я также забыл добавить объявление belongs_to в рамках модели User. Это может также вызвать проблемы. :) Сообщение отредактировано, чтобы отразить. –

1

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

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 

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

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

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

PS:

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

+0

Как я надеюсь работать, у пользователя есть профиль, и у команды много профилей. На странице показа для конкретной команды я перечислил всех пользователей с профилем для этой команды. – Kelvin

+0

Отредактировал свой ответ для вашей цели kgb. Ура! –