Используя генераторы я создал 2 модели (и таблицы в БД):
rails g model Article name:string hunt_name:string body:text
rails g model Category name:string hunt_name:string
После чего в моделях я прописал следующее:
class Category < ApplicationRecord
self.primary_key = :hunt_name
has_and_belongs_to_many :articles
end
class Article < ApplicationRecord
self.primary_key = :hunt_name
has_and_belongs_to_many :categories
end
Насколько я понимаю, primary_key указывает поле, по которому будет производиться поиск при вызове, например Article.find(id) (поправьте, если неправ). Кроме того в поле id данной таблицы будет содержаться уже не число (1, 2, 3...), а именно то, что находится в поле hunt_name (опять же, поправьте, если неправ).
После этих манипуляций я создал JoinTable:
rails g migration CreateJoinTableArticlesCategories articles categories
Но привязки статей к категориям не происходит по очевидной причине (узнал, посмотрев в скиму): поля в Join Table'е имеют тип integer, в то время как hunt_name, который, как мне кажется (см. выше) является id в своей таблице - типа string.
Отсюда вопрос: стоит ли вообще делать так, как я делаю (может быть стоит вообще отключить id в таблицах articles и categories)? Если это не противоречит Convention over Configuration, то как указать Join Table'у, что его поля должны иметь тип string? Или по-другому: как сохранить id в двух таблицах в числовом виде, но при этом оперировать данными, обращаясь к hunt_name (как будто бы это он id), и при этом всем не менять тип данных в Join Table'е? Что из этого лучше и как делать правильнее?
Еще насчет миграции: опцию
idвы отключили потому, что при ее наличии она автоматически станет первичным ключом? И еще. Ваша строчка в миграции, создающая pk не равна такой?t.string :key, index: {unique: true}. Потому что при такой созданной таблице у меня нормально отрабатывают и хелперы и все остальное вроде поисковых по таблице методов. – smellyshovel May 21 '17 at 07:24hunt_name, а в другой - строковоеname, то как должны выглядеть поля в JoinTable?t.string: article_hunt_nameиt.string: tag_nameили как и без изменения первичного ключаt.string :article_idиt.string tag_id? – smellyshovel May 21 '17 at 07:48create_table. Нет, первичный ключ имеет чуть более весомый статус, чем unique+not-null. Необходимые названия полей можно и методом тыка установить, по сообщениям об ошибках. – May 21 '17 at 14:55