3

我目前有 2 个模型设置:

class Topic < ActiveRecord::Base
  belongs_to :category
end

class Category < ActiveRecord::Base
  has_many :topics
end

我现在正在尝试创建一个与 rails 控制台中关联的类别的主题:

t = Topic.new :name => "Test", :category => Category.find(1)

问题是模型有 category_id,所以我需要使用:

c = Category.find(1)
t = Topic.new :name => "Test", :category_id => c.id

但是,我已经多次看到简单地使用 :category 而不是 :category_id 并传入类别对象而不是对象 id 的能力。我哪里错了?

当我做:

c = Category.find(1)
t = Topic.new :name => "Test", :category => c

我收到:

ActiveRecord::UnknownAttributeError: unknown attribute: category
4

2 回答 2

7

你应该能够做到这一点:

c = Category.find(1)
t = Topic.new :name => "Test", :category => c

模型上的关联定义使您可以执行此操作。

有趣的是,您可以使用 :category_id 并且仍然只是传入对象,它会为您获取 ID:

t = Topic.new :name => "Test", :category_id => c

另一种方法可以更好地做到这一点:

t = c.topics.build(:name => "Test") # Builds an object without saving

t = c.topics.create(:name => "Test") # Builds an object and saves it
于 2012-04-18T18:28:45.360 回答
0

这是对我有用的 MRE

u = User.first

Trainer.create(name: "John", user: u)

请注意,Trainer 模型中没有“用户”列,只有 user_id,但是当我们.create在 Trainer 中记录时,我们仍然使用user(rails 知道将该用户的 id 放入user_id

于 2020-08-14T17:58:12.997 回答