【问题标题】:Adding to multiple tables in rails添加到rails中的多个表
【发布时间】:2008-10-28 19:41:04
【问题描述】:

我确信这是一个相对简单的问题,并且必须有一个很好的明智的 rails 方法来做,但我不确定它是什么。

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

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

我确信在 rails 中有一种简单的方法可以做到这一点 - 但我似乎找不到它。

干杯,

罗宾

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    假设您的表单传递了 author_name 和带有书籍属性的书籍哈希,您可以在控制器中执行以下操作:

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

    这将查找具有该名称的作者,或创建一个作者,然后将该作者分配给所创建的图书。

    注意:这还假设作者可以通过他们的姓名进行唯一标识,但通常情况并非如此。例如,那里可能有多个名叫“史蒂文·金”的人,但其中只有一个人写了 The Shining

    【讨论】:

    • 感谢您的快速回复!这看起来是个不错的方法——尽管在某些方面我很惊讶 Rails 并没有更自动地做到这一点。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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。

      【讨论】:

        【解决方案4】:

        这最终将是自动的(根据这篇文章,在 Rails 2.2 中): http://ryandaigle.com/articles/2008/7/19/what-s-new-in-edge-rails-nested-models

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多