【发布时间】:2019-12-03 12:38:55
【问题描述】:
我在 6 号轨道上,
我想在创建记录时使用 sql 函数作为某些属性的值。
该 sql 函数将是动态的,如果它是静态的,则使用它作为默认值是有意义的。
我能做的是写一个before_create 回调,类似于:
def populate_value_from_sql
self.attr_name = self.connection.select_value('SELECT dynamic_function()')
end
但这会导致额外的 sql 查询,我想避免额外的查询,只需编译 inset 的 sql 以使用 sql 函数而不是硬编码值。 而且我想继续使用 Rails 方式,这样我的验证和回调等仍然可以正常工作,我不想采用完整的原始 sql 路由。
谢谢,
【问题讨论】:
-
在 postgres 上,您可以使用触发器在数据库级别执行此操作。 postgresql.org/docs/9.1/sql-createtrigger.html
-
我必须使用我想调用的函数的动态名称,为清楚起见,这些将是序列名称。所以我不能使用触发器,这些触发器名称将来自数据库之外
-
你不能将函数的字符串值传递给触发器函数,这样你就可以在触发器函数中插入函数。然后在实际触发中,你引用触发函数?
-
我不确定我是否正确理解了你@MikeHeft,但我认为你所说的是传递一个动态触发的值,而不是根据该值决定调用哪个函数?如果是这样,如果您可以证明您的解决方案作为答案,那就太好了,如果它非常适合我的用例,我对触发器没有任何反对意见。虽然我更喜欢没有这些的东西。
标签: ruby-on-rails activerecord rails-activerecord