Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 连接“上的id”;创建; Ruby 2.1 轨道4.2_Ruby On Rails_Ruby_Ruby On Rails 4_Concatenation_String Concatenation - Fatal编程技术网

Ruby on rails 连接“上的id”;创建; Ruby 2.1 轨道4.2

Ruby on rails 连接“上的id”;创建; Ruby 2.1 轨道4.2,ruby-on-rails,ruby,ruby-on-rails-4,concatenation,string-concatenation,Ruby On Rails,Ruby,Ruby On Rails 4,Concatenation,String Concatenation,我需要(通过连接)在新记录上生成一个代码(包含产品id)。 问题是必须创建记录才能有id。因此我无法在“create”上生成代码,因为de id还不存在。我卡住了 到目前为止,它是有效的,但只有在更新 class Product < ActiveRecord::Base before_save :generate_code private def generate_code tag = tags.map(&:name).join(", ").first(2

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

最终解决方案是:

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部分,您没有id)和更新之前生成新代码(第2部分,由于您已经有id,所以与之前的版本一样工作正常)

类产品
正如@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 
类产品
您可以有一个不包含记录“id”的“部分代码”,当您想要访问记录的“完整代码”时,模型将使用部分代码+id计算真正的完整代码。这很好,但我需要整个代码进行搜索。您也可以在创建后使用
回调。这样,它只创建一次,根本不影响
保存。e、 g.
在创建之后:生成代码,而不是
self.code=
使用
update属性(:code,“{category\u id}}{tag}{id}{glasse.code}”)
一个附带问题,
.first(2)
的作用是什么?处理所有标签的效率有点低,这不是像这样的工作
tags.first.name.first(2)
为什么不在保存后将其设置为
,这可能不是same@MohammadAbuShady否,因为
update\u属性
将再次调用
save
,这将创建一个无限循环。无论是创建后的
还是更新前的
都不会导致
save
的任何重叠问题
update\u属性
都不会触发回调。据我所知,好吧,所以是
update\u columns
,@maiconsanson我现在看到了问题,并且相应地更新了我的答案。问题是,现在正在无限地调用before_update。我已将代码更改为在更新之前使用
self.code
,在创建之后使用
更新属性。但这似乎有点骇人,我会选择穆罕默德的
update\u column
解决方案。