簡體   English   中英

MySQL函數使用Rails / ActiveRecord

[英]MySQL function using Rails/ActiveRecord

我在使用Rails / ActiveRecord時遇到問題。

我想用MySQL函數插入記錄,例如GeomFromText('POINT(1 1)') 通常使用ActiveRecord,會自動引用這些函數。 我不想引用這些值。

Model.create(geo: GeomFromText('POINT(1 1)'))

此ActiveRecord語句將生成以下SQL

INSERT INTO `Model` (`geo`) VALUES ('GeomFromText(\'POINT(1 1)\')')

使用原始SQL可能很容易,但我想使用ActiveRecord,因為我的Model設置了幾個回調包括self table。

如何在ActiveRecord語句中使用MySQL函數?

摘要

你不能設計; 此行為對於防止SQL注入攻擊很重要。 您需要與ActiveRecord一起顯式執行原始SQL。

細節

如您所見,SQL語句按設計插入為字符串,這不符合您的要求(Rails~> 4.0):

> Country.create(name: 'LOWER("CANADA")')
  => SQL (0.3ms)  INSERT INTO `Country` (`Name`) VALUES ('LOWER(\"CANADA\")')

你也不能使用適用於.where方法的相同技巧:

> Country.create(["name = LOWER(:country)", { country: 'CANADA' }])
  => ArgumentError: When assigning attributes, you must pass a hash as an argument.

您需要首先執行任意SQL以獲取正確的值,然后通過ActiveRecord進行另一個SQL調用以實現您的回調:

> Country.create( name: ActiveRecord::Base.connection.execute(%q{ SELECT LOWER('CANADA') }).first[0] )
  =>     (0.3ms)  SELECT LOWER('CANADA')
  => SQL (0.3ms)  INSERT INTO `Country` (`Name`) VALUES ('canada')

也就是說,在應用層而不是數據庫層重新實現SQL函數可能更簡潔(除非你有一個非常復雜的SQL函數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM