Статья будет дополняться, по мере разбора новых связей.
и прям очередной мой стыд, чем отличается has_one от belongs_to а тем что в первом случае id со связью не в нашей таблице, а во второй id со связью в нашей.
милочка а вы знали что яйца чернеют от серебра?
век живи, век учись сказал поручик ржевский и предложил серебренный портсигар из кармана штанов в мундир.
создадим все по юзеру, у него будет связь один ко многим с заказами и один к одному с адресами.
!!! основное что нужно запомнить в таблицах с которыми мы создаем связь поле для связи через id должно называться имени таблицы с которой связываем подчеркивание id
bin/rails generate scaffold user login:string pass:string email:string balans:integer
bin/rails generate scaffold adr adres:string user_id:integer
bin/rails generate scaffold zakaz user_id:integer tovar:string
class User < ApplicationRecord
has_many :zakaz
has_one :adr
# has_many :adr # второй вариант смотри ниже
end
class Zakaz < ApplicationRecord
belongs_to :user
end
class Adr < ApplicationRecord
belongs_to :user
end
связь один ко многим юзера с товаром
u=User.create(login:"test1", pass: "1234", email:"testmail.ru", balans:101)
Zakaz.create(user_id: 1, tovar: "milk")
Zakaz.create(user_id: 1, tovar: "car")
Zakaz.create(user_id: 1, tovar: "beer")
User.find_by_id(1).zakaz.map{|x| p x.tovar }
связь один ко ко дному юзера с адресом, однонаправленная
Адрес знает о одном своем юзере, но абратное не верно, если уже совсем просто в модели юзера нет никаих упоминаней об адресе, вот и ничего и не знаем(ниже мы все закаментили)
class User < ApplicationRecord
has_many :zakaz
#has_one :adr
#has_many :adr
end
Adr.find_by_id(2).user.login
User.find_by_id(2).adr.adres #undefined method `adr' for #
связь один ко ко дному юзера с адресом, в обе стороны
class User < ApplicationRecord
has_many :zakaz
has_one :adr
#has_many :adr
end
User.find_by_id(2).adr.adres # уже работает, но если адресов у юзера несколько будет выбран первый
связь один ко ко дному юзера с адресом, один ко многим
class User < ApplicationRecord
has_many :zakaz
#has_one :adr
has_many :adr
end
User.find_by_id(1).adr.map{|x| p x.adres }
# и тоже самое двумя способами, надо подробнее разобрать на досуге
User.find_by_id(1).adr.collect(&:adres)
User.find_by_id(1).adr.map(&:adres)