1

Я новичок в 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 работать?

ответ

0

Каковы ваши шаблоны использования? Я предполагаю, что вы просто хотите найти активный носок с учетом обуви и если данный носок активен или неактивен. Чтобы быстро найти активный носок данного ботинка, вам просто нужно дать Sock внешний ключ для его обуви с ассоциацией belongs_to.

class Sock < ActiveRecord::Base 
    belongs_to :shoe 
end 

И выяснить, если Носок активен или неактивен, дает его владелец обувной ссылки на его активную носке так:

class Shoe < ActiveRecord::Base 
    belongs_to :sock 
end 

Теперь вы можете просто пойти в его владельце обувь и проверьте, является ли активный носок обуви текущим Носком или нет. Например.

def is_active 
    owner_shoe.active_sock == self 

В основном, свяжите их с иностранными ключами, и вы в порядке! P.S.вы pluralized Socks, но соглашение Rails - использовать единственное число для имен моделей.

РЕДАКТИРОВАТЬ: Вы запросили миграцию, так что вот один из приведенных выше кодов. Предостережение: в Rails я долго не выполнял миграцию, поэтому что-то может быть отключено.

class CreateGettingDressed < ActiveRecord::Migration 
    def change 
    create_table :shoes do |t| 
     t.belongs_to :active_sock, foreign_key: "sock_id" 
     t.string :size 
     t.timestamps null: false 
    end 

    create_table :socks do |t| 
     t.belongs :owner_shoe, foreign_key: "shoe_id" 
     t.string :pattern 
    end 
    end 
end 
+0

Спасибо, я исправил плюрализацию. Я думал о решении, которое вы описываете, но я не знал, как реализовать внешние ключи в таблицах, которые ссылаются друг на друга. На мой взгляд, мне нужна ссылка has_many/one и т. Д., Чтобы описать связь. Я перечитаю [руководство ассоциаций активных записей] (http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association), чтобы лучше понять его. – user3456978

+0

Чтобы реализовать и использовать внешний ключ, я считаю, что вам нужно использовать ассоциацию в объявлении класса и в процессе миграции, вы делаете целочисленный столбец для этого ключа. Я буду редактировать свой пост позже для примера миграции. –

+0

Я не мог найти хороший ответ на этот вопрос. Я спросил его в собственном [вопрос] (http://stackoverflow.com/questions/32773946/belongs-to-belongs-to-association-only-no-has-many-or-has-one), чтобы будущие пользователи может найти решение, и подумал, что дам вам знать. Я также собираюсь попробовать и посмотреть, не сломается ли она. – user3456978

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

  • Нет связанных вопросов^_^