#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-3.1
#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-3.1
Вопрос:
У меня есть два класса моделей: Cars и Customers,
Модельные автомобили:
class car < ActiveRecord::Base
#car has attribute :town_code
has_many :customers
end
Клиенты модели:
class customer < ActiveRecord::Base
# customer has attribute :first_name, :last_name
belongs_to :car
end
В моем контроллере у меня есть следующий код:
my_customer = Customer.find_all_by_first_name('John')
p my_customer.last_name
p my_customer.car_id
Но я получил no attribute 'car_id'
ошибку, я также получил no attribute 'last_name'
error.
—Вопрос 1:—
Я проверил свою базу данных, у меня действительно есть столбцы ‘car_id’ и ‘last_name’ в моей таблице customer. Почему я не могу получить к ним доступ так, как это делает мой код контроллера?
—Вопрос 2:—
но код: my_customer.map(amp;:car_id)
работает для доступа к car_id, однако я не совсем понимаю код .map(amp;:car_id)
, что он делает? Кто-нибудь может мне объяснить?
Ответ №1:
Причина, по которой вы не можете этого сделать, my_customer.last_name
заключается в том, что my_customer
здесь не клиент, а множество клиентов, поскольку вы это сделали find_all
. Это также то, почему my_customer.map(amp;:car_id)
работает. Этот фрагмент кода означает следующее: для каждого объекта в массиве my_customer вызовите метод car_id
и вставьте результаты в новый массив — и верните этот новый массив.
Если клиент принадлежит car, вам нужен car_id в таблице customer (который соответствует столбцу id в таблице car). Кроме того, у вас не должно быть last_name в таблице car, а скорее в таблице customer.
Похоже, вам, возможно, придется отступить назад и лучше понять ассоциации ActiveRecord. В любом случае, мне непонятно, почему клиент должен принадлежать автомобилю.
Комментарии:
1. Привет, это моя опечатка, когда я сказал, что у меня есть car_id и last_name в таблице ‘car’, на самом деле они находятся в таблице ‘customer’. Это просто моя опечатка. Меня больше всего беспокоит код «.map(amp;:car_id)», что он делает?
2. что означает ‘amp;’ в .map(amp;:car_id)? Имеется в виду только вызов метода?
3.
map
принимает блок, который запускается для каждого элемента в коллекции, поэтому вы часто делаете что-то вродеmy_array.map{|item|item.car_id}
.amp;
Превращает метод в блок; по сути, теперь вы передаете блок, состоящий из «вызова метода». По сути, это короткий путь.