我确信这是一个相对简单的问题,并且必须有一个很好的合理的轨道方式,但我不确定它是什么。
基本上我将书籍添加到数据库中,我想将作者存储在一个单独的表中。所以我有一个叫做作者的表,由表格书引用。
我想创建一个用于添加图书的rails表单,我希望它只是Author,Title,Publisher等的简单表单,如果它发现作者已经在authors表中那么它应该只是引用该记录,如果它不在authors表中,那么它应该添加一条新记录并引用它。
我确信在轨道上有一种简单的方法 - 但我似乎无法找到它。
干杯,
罗宾
答案 0 :(得分:6)
假设您的表单传递了author_name和带有book属性的书籍哈希,您可以在控制器中执行以下操作:
@author = Author.find_or_create_by_name(params[:author_name])
@book = Book.new(params[:book])
@book.author = @author
@book.save
这将通过该名称找到作者,或创建一个,然后将该作者分配给所创建的书。
注意:这也假设作者可以通过他们的名字进行唯一识别,而这通常不是这种情况。例如,可能会有多个家伙把“史蒂文·金”纳入其中,其中只有一个人写了 The Shining
答案 1 :(得分:5)
我建议您观看Railscast here的复杂表单系列。
答案 2 :(得分:1)
robintw对Micah回答的评论:
这看起来是一个很好的方法 - 虽然我在某些方面感到惊讶,Rails不会自动做得更多
这是四行! Rails可以自动生成多少?这是一个不是人类的框架。 :)
这里有两个:
@author = Author.find_or_create_by_name(params[:author_name])
@book = Book.create params[:book].merge({:author_id => @author.id})
Honza的答案有很多优点:
class Book < ActiveRecord::Base
...
def author_name=(author_name)
self.author = Author.find_or_create_by_name author_name
end
end
使用此示例,并假设您的表单具有“book [author_name]”之类的参数,您的代码只是:
@book = Book.create params[:book]
Wowzers。
答案 3 :(得分:0)
这最终将是自动的(根据这篇文章,在Rails 2.2中): http://ryandaigle.com/articles/2008/7/19/what-s-new-in-edge-rails-nested-models