[英]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.