Я новичок в Rails и работаю над проблемой. У меня есть две таблицы:Ассоциации рельсов has_many через решение о банке/архиве?
обувь и носки
обувном может иметь много носки, но только один активный Носок. Другие носки неактивны. Все носки также уникальны с уникальными узорами. Я хочу убедиться, что у меня нет носков с одинаковым рисунком. Я думаю, что я могу сделать это три способов
1) Используя дополнительный столбец в таблицах носков, чтобы представлять активный носок
class Shoe < ActiveRecord::Base
has_many :socks
end
class Sock < ActiveRecord::Base
belongs_to :shoe
end
class CreateGettingDressed < ActiveRecord::Migration
def change
create_table :shoes do |t|
t.string :size
t.timestamps null: false
end
create_table :socks do |t|
t.belongs_to :shoe, index:true
t.string :pattern
t.boolean :active
t.timestamps null: false
end
end
end
Это кажется довольно простым, но громоздким. Я бы искал носки с помощью shoe_id и вытащил active_sock и вернул шаблон. Я думаю, что я бы проиндексировал [active_sock, shoe_id] в массиве, чтобы ускорить его.
2) Используя дополнительную таблицу в архив неактивных носков
class Shoe < ActiveRecord::Base
has_many :socks
has_many :inactive_socks
end
class Sock < ActiveRecord::Base
belongs_to :Shoe
end
class Inactive_sock < ActiveRecord::Base
belongs_to :Shoe
end
class CreateGettingDressed < ActiveRecord::Migration
def change
create_table :shoes do |t|
t.string :name
t.timestamps null: false
end
create_table :socks do |t|
t.belongs_to :shoe, index:true
t.string :pattern
t.timestamps null: false
end
create_table :inactive_socks do |t|
t.belongs_to :shoe, index:true
t.string :pattern
t.timestamps null: false
end
end
end
Это кажется громоздким, а также, но если вы просто имеет дело с активными носками простых в использовании и быстро. Но, покупая новый носок, я должен проверить шаблон с обеими таблицами.
3) Использование has_many: через отношения
class Shoe < ActiveRecord::Base
has_many :active_socks
has_many :socks, through: active_socks
end
class Active_Sock < ActiveRecord::Base
belongs_to :Shoe
belongs_to :Sock
end
class Sock < ActiveRecord::Base
has_many :active_socks
has_many :shoes, through: active_socks
end
class CreateGettingDressed < ActiveRecord::Migration
def change
create_table :shoes do |t|
t.string :name
t.timestamps null: false
end
create_table :socks do |t|
t.string :pattern
t.timestamps null: false
end
create_table :active_socks do |t|
t.belongs_to :shoe, index: true
t.belongs_to :sock, index: true
t.string :pattern
t.boolean :active
t.timestamps null: false
end
end
end
Это кажется вариант 2, но я чувствую, что я использую Rails инструменты, чтобы сделать его менее громоздким. Когда я ищу шаблоны, я просто проверяю таблицу носков, когда я ищу один active_sock, я просто ищу таблицу active_socks.
Я читал подобные сообщения, и кажется, что варианты 1 и 2 обычно используются в закрытых_зачетах, запрещают пользователям, запрещают публикации, архивирование и т. Д. Ситуации, в которых вам нужно различать данные, которые немного отличаются друг от друга. Выбор там, кажется, смотрит на то, что вам нужно, и выберите вариант 1 или 2, который лучше всего подходит вам.
Мое понимание для has_many через ситуации, похоже, когда у вас есть отношения, и вам нужны дополнительные метаданные, которые вы можете использовать. Я думаю, что это соответствует ситуации.
Правильно ли я настроил параметр 1, и правильно ли это, что индексирование массива [shoe_id и active] даст мне быстрый поиск? Является ли вариант 3 соответствующим использованием has_many через? Будет ли мое объяснение варианта 3 работать?
Спасибо, я исправил плюрализацию. Я думал о решении, которое вы описываете, но я не знал, как реализовать внешние ключи в таблицах, которые ссылаются друг на друга. На мой взгляд, мне нужна ссылка has_many/one и т. Д., Чтобы описать связь. Я перечитаю [руководство ассоциаций активных записей] (http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association), чтобы лучше понять его. – user3456978
Чтобы реализовать и использовать внешний ключ, я считаю, что вам нужно использовать ассоциацию в объявлении класса и в процессе миграции, вы делаете целочисленный столбец для этого ключа. Я буду редактировать свой пост позже для примера миграции. –
Я не мог найти хороший ответ на этот вопрос. Я спросил его в собственном [вопрос] (http://stackoverflow.com/questions/32773946/belongs-to-belongs-to-association-only-no-has-many-or-has-one), чтобы будущие пользователи может найти решение, и подумал, что дам вам знать. Я также собираюсь попробовать и посмотреть, не сломается ли она. – user3456978