在“创建”上连接id

时间:2015-03-31 18:07:40

标签: ruby-on-rails ruby ruby-on-rails-4 concatenation string-concatenation

  • Ruby 2.1
  • Rails 4.2

我需要在新记录上生成(通过连接)代码(包含产品ID)。 问题是必须创建记录才能拥有id。所以我无法在“创建”上生成代码,因为de 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

1 个答案:

答案 0 :(得分: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所说,这也应该有效,因为它是一个没有回调或验证的直接数据库编辑

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