1
  • 紅寶石2.1
  • 的Rails 4.2

我需要生成(通過串聯)代碼(其中包含產品ID)的新記錄。 問題是必須創建記錄才能擁有一個id。所以我不能在「創建」上生成代碼,因爲ID尚不存在。我卡住了。串連ID 「創造」

到目前爲止它工作,但只在更新。

class Product < ActiveRecord::Base 

    before_save :generate_code 

    private 

    def generate_code 
    tag = tags.map(&:name).join(", ").first(2) 
    self.code = ("#{category_id} #{tag} #{id} #{glaze.code}").parameterize 
    end 

end 

如何創建新記錄並同時在「代碼」上連接您的ID?

更新:

我需要它更新了。

最終的解決方案是:

class Product < ActiveRecord::Base 
    after_save :generate_code 
    private 

    def generate_code 
    tag = tags.first.name.first(2) 
    update_column(:code, ("#{category_id}" + "#{tag}" + "#{id}" + "#{glaze.code}").parameterize.upcase) 
    end 
end 
+0

你可以有一個「部分代碼」,它不包含記錄的「ID」,當你想獲得「完整的代碼「的模型將計算真正的完整代碼與部分1 + ID。 – MrYoshiji 2015-03-31 18:10:53

+0

這將是很好,但我需要整個代碼進行搜索。 – maiconsanson 2015-03-31 18:26:29

+2

你也可以使用'after_create'回調。這種方式只創建一次,根本不會影響「保存」。例如'after_create:generate_code'然後代替'self.code ='使用'update_attribute(:code,「#{category_id}#{tag}#{id}#{glaze.code}」)' – engineersmnky 2015-03-31 18:40:16

回答

2

你可以嘗試這樣的事情。這將生成創建(第1點部分的問題,你有沒有ID)後,新的代碼和更新(第2部分問題,這是因爲你已經有一個id爲前正常工作)之前

class Product < ActiveRecord::Base 
    after_create :generate_code 
    before_update :generate_code 
    private 

    def generate_code 
    tag = tags.map(&:name).join(", ").first(2) 
    if changed? 
     self.code = "#{category_id} #{tag} #{id} #{glaze.code}" 
    else 
     update_attribute(:code,"#{category_id} #{tag} #{id} #{glaze.code}") 
    end 
    end 
end 

由於@MohammadAbuShady提到了這一點還應該工作,因爲它是直接DB編輯沒有回調或驗證

class Product < ActiveRecord::Base 
    after_save :generate_code 
    private 

    def generate_code 
    tag = tags.first.name.first(2) 
    update_column(:code, "#{category_id} #{tag} #{id} #{glaze.code}") 
    end 
end 
+0

爲什麼不僅僅是'after_save',那可能不會是相同的 – 2015-03-31 19:20:07

+0

@ MohammadAbuShady不會,因爲'update_attribute'會再次調用'save',這會造成無限循環。 'after_create'或'before_update'都不會導致與'save'有任何重疊的問題。 – engineersmnky 2015-03-31 19:29:13

+0

'update_attribute'應該不會觸發回調,據我所知 – 2015-03-31 19:30:13