在rails控制台中创建关联模型?

Dam*_*che 2 ruby ruby-on-rails

我目前有2个型号设置:

class Topic < ActiveRecord::Base
  belongs_to :category
end

class Category < ActiveRecord::Base
  has_many :topics
end
Run Code Online (Sandbox Code Playgroud)

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

t = Topic.new :name => "Test", :category => Category.find(1)
Run Code Online (Sandbox Code Playgroud)

麻烦的是模型有category_id,所以我需要使用:

c = Category.find(1)
t = Topic.new :name => "Test", :category_id => c.id
Run Code Online (Sandbox Code Playgroud)

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

当我做:

c = Category.find(1)
t = Topic.new :name => "Test", :category => c
Run Code Online (Sandbox Code Playgroud)

我收到:

ActiveRecord::UnknownAttributeError: unknown attribute: category
Run Code Online (Sandbox Code Playgroud)

Bri*_*ood 5

你应该能够这样做:

c = Category.find(1)
t = Topic.new :name => "Test", :category => c
Run Code Online (Sandbox Code Playgroud)

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

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

t = Topic.new :name => "Test", :category_id => c
Run Code Online (Sandbox Code Playgroud)

另一种方法可以做得更好一点:

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

t = c.topics.create(:name => "Test") # Builds an object and saves it
Run Code Online (Sandbox Code Playgroud)