Ruby on rails 连接“上的id”;创建; Ruby 2.1 轨道4.2
我需要(通过连接)在新记录上生成一个代码(包含产品id)。 问题是必须创建记录才能有id。因此我无法在“create”上生成代码,因为de id还不存在。我卡住了 到目前为止,它是有效的,但只有在更新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
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
解决方案。