2015-01-27 2 views
0

Вот пример отношения:Почему я могу обойти связь has_one с оператором <<?

class User < ActiveRecord::Base 
    has_one :group, through: :group_membership 
    has_one :group_membership 
end 

class Group < ActiveRecord::Base 
    has_many :users, through: :group_memberships 
    has_many :group_memberships 
end 

class GroupMembership < ActiveRecord::Base 
    belongs_to :group 
    belongs_to :user 
end 

Почему я в состоянии сделать следующее?

Group.first.users << User.first 
Group.second.users << User.first 

Я бы подумал, что отношения has_one помешали бы этому. Есть ли какая-то магия за <<, о которой я не знаю?

User.first.group вернет вторую группу, но обе группы сохраняются.

+0

'has_one' возвращает только один результат. Это не мешает вам что-либо делать. Это может быть неожиданным, если вы добавите в ассоциацию более одного элемента. – ptd

+0

Вы что? Ruby 2.1.5, Rails 4.2.0, я получаю 'NoMethodError', так как моя модель вообще не имеет' << '. –

ответ

1

has_one может помочь вам, если вы добавите к стороне User ассоциации, т.е. когда вы используете метод has_one (где нет <<).

Лучший способ получить то, что вы хотите здесь, - это фактически изменить ассоциацию так, чтобы она была belongs_to на стороне User. Тогда User может связываться только с одним Group. Вы могли бы достичь аналогичной вещи с уникальным индексом БД на поле user_id в таблице group_memberships.

+0

Добавление уникального ограничения в БД было большим предложением было отличным предложением. Благодаря! –

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