使用对象代替ID与Rails 3.1创建调用

时间:2012-01-03 22:38:28

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

我正在使用Rails 3.1.3和Ruby 1.9.2,并且在我的数据库中创建种子数据时,我遇到了一个看似错误的问题。我正在创建一个简单的葡萄酒收藏应用程序,我有一个只有两个简单实例的Grape类(name是“红色”或“白色”)。我有一个Varietal课程belongs_to Grape课程,并且只有一个简单的name字段。

当我创建一些种子数据时,我使用如下代码:

# create some reds
r = Grape.find_or_create_by_name('Red')
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r)
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r)
Varietal.find_or_create_by_name_and_grape_id('Malbec', r)

# create some whites
w = Grape.find_or_create_by_name('White')
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w)
Varietal.find_or_create_by_name_and_grape_id('Riesling', w)
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w)

奇怪的是,当我查看数据库中的数据时,Varietals所有都与“红色”Grape相关联。使用Rails控制台,我发现如果我从找到的id实例而不是实例本身传递Grape字段,我会得到正确的行为。

我错过了什么吗?我认为在Rails中你总是可以传递一个ActiveRecord对象来代替原始ID,它会自动查找id字段值。

2 个答案:

答案 0 :(得分:0)

你可以规范传递对象而不是ID,但在路由和关联方面往往更多。

您要求它通过名称 grape_id 查找,但传递名称和葡萄实例,这就是问题所在所在。

如果您在finder中规定了id,则需要传入ID。

答案 1 :(得分:0)

rw应该返回Grape个对象,对吗?那么你不能像这样访问他们的id元素吗?

# save grape stuff by entering the ID instead of the object
# create some reds
r = Grape.find_or_create_by_name('Red')
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r.id)
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r.id)
Varietal.find_or_create_by_name_and_grape_id('Malbec', r.id)

# create some whites
w = Grape.find_or_create_by_name('White')
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w.id)
Varietal.find_or_create_by_name_and_grape_id('Riesling', w.id)
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w.id)

这将传递您选择的葡萄的ID,并与您正在使用的动态查找器匹配。