添加到rails中的多个表

时间:2008-10-28 19:41:04

标签: ruby-on-rails ruby

我确信这是一个相对简单的问题,并且必须有一个很好的合理的轨道方式,但我不确定它是什么。

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

我想创建一个用于添加图书的rails表单,我希望它只是Author,Title,Publisher等的简单表单,如果它发现作者已经在authors表中那么它应该只是引用该记录,如果它不在authors表中,那么它应该添加一条新记录并引用它。

我确信在轨道上有一种简单的方法 - 但我似乎无法找到它。

干杯,

罗宾

4 个答案:

答案 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