2008-10-28 38 views
4

我确定这是一个相对简单的问题,并且必须有一个很好的明智的轨道方法,但我不确定它是什么。添加到轨道中的多个表格

基本上,我将书籍添加到数据库,并且我想将作者存储在单独的表格中。所以我有一个表格,这个表格叫做作者,这个表格被桌子所引用。

我想创建一个用于添加书籍的Rails表单,并且我希望它只是作者,标题,出版商等的简单表单,并且如果它发现作者已经在authors表中,那么它应该只需引用该记录,并且如果它不在authors表中,那么它应该添加一条新记录并引用它。

我敢肯定有一个简单的方法来做到这一点在轨道 - 但我似乎无法找到它。

干杯,

罗宾

回答

5

我建议你看复杂的形式Railscasts here系列。

6

假设你的形式与书属性传递一个AUTHOR_NAME和一本书的哈希,你可以做你的控制器中的以下内容:

@author = Author.find_or_create_by_name(params[:author_name]) 
@book = Book.new(params[:book]) 
@book.author = @author 
@book.save 

这将找到或者创建一个作者,然后将该作者分配给创建的书。

注意:这也假设作者可以通过他们的名字来唯一标识,通常情况并非如此。有可能是namned“史蒂芬王”那里人多,例如,只有其中一人写道:闪灵

+0

感谢您的快速反应!这看起来是一种很好的方式 - 尽管我在某些方面感到惊讶,Rails不会自动执行一些操作。 – robintw 2008-10-28 19:57:16

1

robintw的米迦的回答评论:

这看起来像一个好办法做到这一点 - 虽然我在某些方面是Rails不这样做有点吃惊的是自动

这是四行! Rails能够自动完成多少工作?这是一个不是人类的框架。 :)

这里,它有两种:

@author = Author.find_or_create_by_name(params[:author_name]) 
@book = Book.create params[:book].merge({:author_id => @author.id}) 

而且洪扎的回答有很多优点:

class Book < ActiveRecord::Base 
    ... 
    def author_name=(author_name) 
    self.author = Author.find_or_create_by_name author_name 
    end 
end 

有了这个例子中,假设您的形式有一个像“一书的参数[author_name]“,你的代码只是:

@book = Book.create params[:book] 

Wowzers。