2012-05-17 3 views
0

у меня есть модель пользователяКак создать несколько отношений между теми же моделями

class User < ActiveRecord::Base 
    has_many :projects 
end 

и у меня есть модели проекта

class Project < ActiveRecord::Base 
    belongs_to :user 
end 

Очевидно теперь каждый проект принадлежит пользователю и может только один пользователь на проект. Теперь я хочу, чтобы мои модели представляли собой другое отношение между двумя моделями. Я хочу, чтобы Пользователь мог следить за несколькими проектами, независимо от того, кто владеет Проектом. Я знаю, что мне придется использовать has_many: through и создать соединение, но я не могу обернуть голову тем, как изменить модель, чтобы сохранить текущие отношения и добавить новые отношения.

+0

Когда вы говорите «следуйте нескольким проектам», вы имеете в виду, что пользователи имеют доступ только для чтения к проектам, которые им не принадлежат? – rb512

+0

Я хочу, чтобы Пользователь мог просматривать список объектов, которые они интересуют только для чтения, если только они не владеют проектом. В этом случае они все равно смогут редактировать проект. – jhamm

ответ

1

Ну, в этом случае в действии show/index отображаются все проекты (Project.all) в таблице проектов. Таким образом, все пользователи имеют доступ ко всем проектам. Теперь в вашем действии редактирования используйте user.projects.all для отображения проектов этого конкретного пользователя. Это должно решить вашу проблему, я не вижу необходимости в дальнейшей ассоциации здесь.

Update:
Этого должно быть достаточно:

class Project < ActiveRecord::Base
belongs_to :user

class User < ActiveRecord::Base
has_many :projects_followed, :through => :projects
user has_many :projects_owned, :through => :projects

Если вы не хотите, чтобы создать еще два отношения, создать только одно:
class ProjectsSubscribed
belongs_to :project
с тремя полями: PROJECT_ID, is_owned, is_followed

+0

Пользователь имеет два разных отношения с проектами. Он может быть владельцем, или он может быть последователем. – jhamm

0

Попробуйте следующие соотношения.

class User < ActiveRecord::Base 
    has_many :followers 
    has_many :projects, :through => :followers 
end 

class Follower < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

class Project < ActiveRecord::Base 
    has_many :followers 
    has_many :users, :through => :followers 
end 

Примечания это: Вы можете использовать has_many: через отношений, если вам нужно работать с моделью отношений как самостоятельный субъект. Если вам не нужно ничего делать с моделью отношений, может быть проще установить отношения has_and_belongs_to_many.

Надеюсь, это полезно.

+0

Что относительно исходных отношений, когда у одного пользователя есть много проектов и проекта, может быть только 1 пользователь? Это больше не существует. – jhamm

+0

Вы можете использовать другую модель ** projects_owned ** для поддержания старого отношения. у него есть project_id и user_id (означает принадлежность к отношению). у пользователя есть has_many для project_owned и проект, имеющий has_one для project_owned. –

+0

@jhamm, вы проверили мой обновленный ответ? – rb512

Смежные вопросы