2010-09-17 58 views
6

Rails的新手...想了解做事情的正确方法...的Rails 3,如何创建主记录后,添加相关的记录(书籍,自动添加BookCharacter)

在我的应用程序用户可以创建一本书(我有这个工作)

我想要发生的是当用户创建一本书,一个记录被添加到BookCharacters表,像(id,book.id,user.id,characterdescription.string )

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

所以,在我的书控制器我有:

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

使用Rails,是实践的书被保存后补充说,什么逻辑?像

Book.create(:creator => current_user.id) 

东西我感谢帮助

回答

16

了解的重要一点是该公约由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。

+0

这是我见过的最好的答案。感谢您帮助我理解使用Rails的正确方法 – AnApprentice 2010-09-18 04:00:21

+0

嗨,谢谢@zetetic - 如果我有两个彼此相关的模型,那么当我创建第一个实例时,我必须手动创建第二个实例并在控制器中将它们连接在一起,而不是在创建第一个 - >是轨道约定时自动创建第二条记录。 CHRS – BKSpurgeon 2017-01-20 03:50:18

0

我喜欢的东西一样(如果用户的has_many书):

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

谢谢,但我的问题是关于创建BookCharacters ...也许我可以编辑,以清除更好? – AnApprentice 2010-09-17 23:30:25

+0

是的,我的错误。@zetetic很好的回答! – Yannis 2010-09-18 06:34:02