【问题标题】:Newbie: access attributes of model object新手:访问模型对象的属性
【发布时间】:2026-01-03 21:45:02
【问题描述】:

我有两个模型类:CarsCustomers

型号汽车

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:---

我检查了我的数据库,我的 customer 表上确实有 'car_id''last_name' 列。为什么我不能像我的控制器代码那样访问它们?

---问题2:---

但是代码:my_customer.map(&amp;:car_id) 正在用于访问 car_id,但是,我不太明白代码 .map(&amp;:car_id),它有什么作用?谁能给我解释一下?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1


    【解决方案1】:

    您无法执行my_customer.last_name 的原因是my_customer 不是此处的客户,而是一组客户,因为您执行了find_all。这也是my_customer.map(&amp;:car_id) 起作用的原因。这段代码的意思是:对于 my_customer 数组中的每个对象,调用方法 car_id 并将结果插入到一个新数组中——然后返回这个新数组。

    如果 customer 属于 car,则需要 customer 表中的 car_id(对应 car 表中的 id 列)。此外,您不应在 car 表中使用 last_name,而应在 customer 表中使用。

    听起来您可能需要退后一步,更好地了解ActiveRecord associations。无论如何,我不清楚为什么客户会属于_汽车。

    【讨论】:

    • 嗨,这是我的错字,当我说我在 'car' 表中有 car_id 和 last_name 时,实际上它们在 'customer' 表中。这只是我的错字。我最关心的是代码“.map(&:car_id)”,它有什么作用?
    • .map(&:car_id) 中的“&”是什么意思?只表示调用方法?
    • map 需要一个块,该块会针对集合中的每个项目运行,因此您经常会执行my_array.map{|item|item.car_id} 之类的操作。 &amp; 把一个方法变成一个块;本质上,您现在正在传递一个由“调用方法”组成的块。这基本上是一条捷径。