Rails 3,如何在创建主记录后添加关联记录(Books,Auto Add BookCharacter)

时间:2010-09-17 21:27:54

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

Rails新手...试图了解正确的做事方式......

在我的应用中,用户可以创建一本书(我有那个工作)

我想要发生的是当用户创建一本书时,会将一条记录添加到BookCharacters表中,例如(id,book.id,user.id,characterdescription.string。)

创建图书时,创建图书的用户应自动添加为第一个BookCharacter。然后,用户可以根据需要手动添加/编辑任意数量的BookCharacters。但最初我希望它们默认自动添加。

所以在我的Book控制器中我有:

def create
 @book = Book.new(params[:book])
 respond_to do |format|
  if @book.save
....

使用Rails,是否可以在保存书籍后添加这种逻辑?像

这样的东西
Book.create( :creator => current_user.id)

我很感激帮助

2 个答案:

答案 0 :(得分:19)

要理解的重要事项是Rails使用ActiveRecord实现关系的约定。一本书有很多字,每个字都属于一本书,所以:

class Book < ActiveRecordBase
  has_many :characters
end

class Character < ActiveRecordBase
  belongs_to :book
end

Rails现在假定characters表将有一个名为book_id的外键,它与books表相关。要创建属于书籍的角色:

@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name")

现在保存@book(假设@book@character都有效),将在bookscharacters中创建一行表格,其中字符行通过book_id链接。

要显示某个角色也属于某个用户,您可以将该关系添加到角色模型中:

class Character < ActiveRecordBase
  belongs_to :book
  belongs_to :user
end

因此,Rails现在希望characters也有一个名为user_id的外键,它指向users表(也需要一个User模型)。在创建角色时指定用户:

@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name",:user=>current_user)

您还可以通过调用对象上的相应方法来分配外键:

@character.user = current_user

这一切都有效,因为它遵循Rails约定来命名模型和表。你可以脱离这些惯例,但如果你这样做,你将更难学习Rails。

答案 1 :(得分:0)

我更喜欢(如果User has_many Book):

def create
 @book = current_user.books.new(params[:book])
 respond_to do |format|
  if @book.save
  …