2012-05-29 6 views
0

Я пытаюсь создать связь между двумя таблицами. Студенческий стол и компьютерный стол. Компьютер может быть назначен только одному ученику (в любой момент), но ученик может быть назначен нескольким компьютерам.Правильная ассоциация Rails для использования

Это то, что я сейчас имею в виду. Настройка связи has-many и ее изменение немного.

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_many :computers, :through => :assignments 
end 

class Computer < ActiveRecord::Base 
has_one :assignment 
has_one :student, :through => :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :student 
    belongs_to :computer 
end 

Это похоже на лучший способ справиться с этой проблемой? Или что-то лучшее, что можно услышать от экспертов здесь. Благодаря!

ответ

1

Вы должны сначала решить, если просто один - Многим отношениям достаточно для вас.

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

Ваши базы данных таблицы «компьютеры», то нужен student_id столбец с не уникальным индексом

Ваши модели должны выглядеть следующим образом:

class Computer < ActiveRecord::Base 
    belongs_to :student 
end 

class Student < ActiveRecord::Base 
    has_many :computers, :dependent => :nullify 
end 

«зависимой аннулирует», потому что вы не хотите удалить компьютер, когда студент удален, но вместо этого отметьте его как бесплатное.

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

+0

Это действительно похоже на лучшее решение, оно сделало код более чистым. – Dan

0

Вы также можете использовать метод has_and_belongs_to_many. В вашем случае это будет:

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_and_belongs_to_many :computers, :join_table => 'assignments', 
end 

class Computer < ActiveRecord::Base 
    has_one :assignment 
    has_and_belongs_to_many :student, :join_table => 'assignments', 
end 

или вы можете переименовать присвоений таблицу computers_students и удалить join_table

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_and_belongs_to_many :computers 
end 

class Computer < ActiveRecord::Base 
    has_one :assignment 
    has_and_belongs_to_many :student 
end 
+2

Я думаю, что имя таблицы должно быть computer_students –

+0

Да, вы должны следовать лексическому порядку имен классов. – thesis

+0

Вы абсолютно правы. – alexkv

0

На самом деле ваш подход хорошо, как один, предлагаемых @alexkv. Это больше, чем вопрос.

Другое дело, если вы хотите использовать таблицу сопоставления для некоторых других целей, например, для хранения дополнительных полей, то ваш подход - лучшая вещь. В таблице has_many :through для модели объединения есть первичный ключ и может содержать атрибуты, как и любая другая модель.

От api.rubyonrails.org:

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

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

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