Новичок: доступ к атрибутам объекта модели

#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; Превращает метод в блок; по сути, теперь вы передаете блок, состоящий из «вызова метода». По сути, это короткий путь.