Rails外键问题

时间:2010-09-17 19:57:21

标签: ruby-on-rails join model foreign-keys

很抱歉,如果这个问题看起来很简单,我对Rails非常陌生(几天前刚刚开始学习),但在咨询Google和“使用Rails进行敏捷Web开发”后,我找不到答案。

我有一个问题,Rails 2.3.8在两个模型上创建一个外键。我的表看起来像这样:

cars                                 manufacturer
----                                 ------------
car_make                             name
car_model                            country
car_class                            logo_url
image_url                            (and default 'id' created by Rails)
manufacturer_id
(and default 'id' created by Rails)

我的'car_make'和'name'字段基本相同;我创建的每辆车,我希望能够将它与现有的制造商联系起来。这是我试图创建FK的列。

我的car.rb有'belongs_to:manufacturer',而我的manufacturer.rb有'has_many:cars'来建立一个制造商与多个汽车的关系。但是,当我创建一辆新车(通过脚手架)时,manufacturer_id字段为空。

我去了我的cars_controller,找到了正在使用的'create'方法,并尝试添加下面的第二行:

@car = Car.new(params[:car])
@car.manufacturer_id = car.manufacturer.id  # <===

这会在CarsController #create中产生'NameError'错误,我看到了:

undefined local variable or method 'car' for #<CarsController:0x1034642f0>

Rails似乎不喜欢我添加的行。我缺少什么使这项工作?

2 个答案:

答案 0 :(得分:0)

嗯,您需要先将制造商提供给汽车才能使用。

@car = Car.new( params[:car] )
m = Manufacturer.first # => as you can see you must already have one made
@car.manufacturer = m
@car.save

car未定义的原因是因为,您还没有定义它。您要将哪个汽车制造商分配给@car

所以基本上你需要在制造汽车之前制造一家制造商。如果您填写的表格中包含制造商的数据,请确保将其放在params中的其他键下,例如params[:manufacturer],并执行与您对汽车相同的操作。也许像:

@car = Car.new( params[:car] )
@manufacturer = Manufacturer.find_or_create_by_name_and_country( params[:manufacturer][:name], params[:manufacturer][:country] )
@car.manufacturer = @manufacturer
@car.save

答案 1 :(得分:0)

在您看来,您想为制造商生成一个下拉列表(我想假设),所以您应该在表单中执行以下操作:

<%= collection_select(:car, :manufacturer_id, Manufacturer.all, :id, :name) %>

然后,您的create操作不需要明确设置manufacturer_id,因为它应该已从表单中收到该内容。