Rails - несколько ассоциаций с одной моделью - PullRequest
4 голосов
/ 20 марта 2012

Я создаю приложение Rails, чтобы отслеживать расходы / долги среди членов группы, скажем, домохозяйства.Пока у меня есть модели для групп, пользователей и расходов - основы.Прямо сейчас я пытаюсь выяснить связи между группами и пользователями.Например, группа может иметь много пользователей, а пользователь может иметь / принадлежать ко многим группам, поэтому я установил связь HABTM с помощью таблицы соединений.Но я запутался, потому что у группы также может быть один владелец, который также является пользователем.Вот где я сейчас нахожусь:

class Group < ActiveRecord::Base
    has_and_belongs_to_many :users
    has_one :owner, :class_name => "User"
end

class User < ActiveRecord::Base
    has_and_belongs_to_many :groups
end

В настоящее время в таблице Group есть поле owner_id, но я получаю сообщение об ошибке PostgreSQL column users.group_id does not exist, когда я пытаюсь сделать что-либо, связанное с group.owner.Я совершенно заблудился - есть идеи о том, как лучше представить здесь несколько ассоциаций с одной и той же моделью?

Ответы [ 2 ]

12 голосов
/ 20 марта 2012

Так что я думаю, что следую тому, к чему вы стремитесь, это быстрый ERD, созданный в Dia:

simple erd

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

class Group < ActiveRecord::Base
    has_and_belongs_to_many :users
    belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"
end

class User < ActiveRecord::Base
    has_and_belongs_to_many :groups
    has_many :owned, :class_name => "Group", :foreign_key => "owner_id"
end
1 голос
/ 20 марта 2012

Как насчет:

class Group < ActiveRecord::Base
    has_and_belongs_to_many :users, :through => :membership
    has_one :owner, :class_name => "User"
end

class User < ActiveRecord::Base
    has_and_belongs_to_many :groups, :through => :membership
    has_many :owned, :class_name => "Group"
end

И создать модель Membership с user_id и group_id?

...