我有两个模型类:汽车和客户,
模型汽车:
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'
错误。
---问题1:---
我检查了我的数据库,我的客户表上有'car_id'和'last_name'列。为什么我不能以我的控制器代码的方式访问它们?
---问题2:---
但是代码:my_customer.map(&:car_id)
正在用于访问car_id,但是,我不太了解代码.map(&:car_id)
,它有什么作用?有谁可以向我解释一下?
答案 0 :(得分:2)
您无法执行my_customer.last_name
的原因是my_customer
不是客户,而是一系列客户,因为您执行了find_all
。这也是my_customer.map(&:car_id)
有效的原因。这段代码的含义是:对于数组my_customer中的每个对象,调用方法car_id
并将结果插入到一个新数组中 - 并返回该新数组。
如果客户属于汽车,则客户表中需要car_id(对应于汽车表中的id列)。此外,您不应该在car表中使用last_name,而应该在customer表中。
听起来你可能需要退后一步,更好地了解ActiveRecord associations。无论如何,我不清楚为什么顾客会属于汽车。