簡體   English   中英

如何在保存Rails 4之前檢查現有記錄?

[英]How to check existing record before saving in Rails 4?

我目前正在開發一個簡單的Rails 4應用程序,我有兩個相關的模型:

book.rb

class Book < ActiveRecord::Base
  belongs_to :author

  accepts_nested_attributes_for :author
end

author.rb

class Author < ActiveRecord::Base
  has_many :books
end

我需要做的是檢查作者是否已經存在,如果存在,請在書上使用它。

我的books_controller.rb

class BooksController < ApplicationController
  .
  .
  .
  def create
    @book = Book.new(BookParams.build(params)) # Uses class for strong params 

    if @book.save
      redirect_to @book, notice: t('alerts.success')
    else
      render action: 'new'
    end
  end
end

有沒有更好的方法來處理這種情況而沒有重復的作者記錄? 謝謝。

您可以使用Book模型中的before_save回調來執行此操作:

class Book < ActiveRecord::Base
  # ...

  before_save :merge_author

  private

  def merge_author
    if (author = Author.find_by(name: self.author.name))
      self.author = author
    end
  end
end

請注意,我在此假設您的Author模型具有標識每個作者的name字段。 也許您想要另一種機制來確定作者是否已經存在。

但是, Active Record Validations還可以幫助您確保Author模型中沒有重復記錄。

我可能會誤解,但請嘗試更多地解決問題。

從我的角度來看,你必須確保自己沒有重復的記錄。 在Rails中,您可以在這種情況下使用Validations。

Rails指南驗證

另一方面,您嘗試解決的問題類似於通過ActiveRecord關聯構建/創建ActiveRecord對象。 你也有一個Rails方式。

Rails指南協會

接下來是回調,嵌套路由/控制器aso,以滿足不同的要求。 你也可以找到它們的Rails指南。 當然它可以是所有東西的組合=)而且你也有嵌套屬性,可能需要考慮。 干杯

我已成功使用以下代碼使其工作:

models/book.rb

def author_attributes=(value)
  self.author = Author.find_or_create_by(value)
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM