Запомнить, где именно в модели в Ruby on Rails нужно помещать инструкцию belongs_to, несложно: если у таблицы есть внешние ключи (англ. foreign key), то соответствующая модель должна иметь для каждого из них инструкцию belongs_to.
Здесь проиллюстрировано одно важное правило: модель для таблицы, имеющей
внешний ключ (англ. foreign key), всегда содержит объявление belongs_to.
В Active Record родительский объект (тот самый, который логически содержит коллекцию дочерних объектов) использует для объявления своих связей с дочерней таблицей has_many, а для дочерней таблицы, чтобы указать на ее родителя, используется объявление belongs_to.
Связи многие ко многим являются симметричными, обе связываемые таблицы объявляют свою связь друг с другом, используя has_and_belongs_to_many.
Rails реализует связи многие ко многим, используя промежуточную объединительную таблицу. В ней содержатся пары внешних ключей, связывающие две заданные таблицы. Active Record предполагает, что имя этой объединительной таблицы является объединением имен двух заданных таблиц, следующих в алфавитном порядке.
product_path против product_url
Поначалу кажется, что будет довольно сложно узнать, когда при необходимости создать ссылку или перенаправление по заданному маршруту нужно использовать метод product_path, а когда метод product_url. Но на самом деле все довольно просто.
При использовании метода product_url вы получите полную начинку с протоколом и доменным именем, наподобие http://example.com /products/l. Его следует использовать, если осуществляется перенаправление redirect_to, поскольку спецификация HTTP при осуществлении перенаправлений с кодом 302 и им подобных требует указывать URL-адрес полностью.
Полный URL-адрес нужен также при перенаправлении с одного домена на другой, например, product_url(domain: "example2.com", product: product).
Во всех остальных случаях можно с успехом использовать product_path. Этот метод будет енерировать только часть пути /products/1, а для ссылок или указания форм вроде link_to "My lovely product", produc_path (product) больше ничего и не нужно.
Путаница возникает из-за того, что снисходительность браузеров зачастую делает эти два метода взаимозаменяемыми. Перенаправление redirect_to можно производить с product_path, и такой вариант, скорее всего, сработает, но с точки зрения спецификации он будет считаться неправильным. Точно так ж е можно при ссылке link_to использовать product_url, но тогда ваш HTML будет засорен ненужными символами, что также нельзя признать удачным вариантом.
Комментариев нет:
Отправить комментарий