Tôi đang chuyển đổi một ứng dụng đường ray từ sử dụng mysql (mysql2 gem) thành postgres (pg gem).connection.select_value chỉ trả về chuỗi trong postgres với pg gem
Với mysql, ActiveRecord::Base.connection.select_value
cuộc gọi trở về giá trị gõ theo các dữ liệu, ví dụ:
> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> 86
> ActiveRecord::Base.connection.select_value("SELECT exception FROM errors where id=565")
=> "TechTalk.Genome.SqlExecutionException"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors where id=565")
=> 565
Tuy nhiên, với postgres, connection.select_value
luôn trả về một chuỗi:
> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT source FROM errors limit 1")
=> "webapp"
này đã phá vỡ một vài đơn vị thử nghiệm, và trong khi chúng có thể sửa chữa được, tôi chắc chắn chúng ta có mã khác dựa trên các giá trị trả về này. Có cách nào để nhận giá trị trả lại đúng cách từ connection.select_value
khi sử dụng postgres không?
Câu trả lời hay nhất chưa từng có! ;) Cảm ơn. –
"mỏng một lớp càng tốt trên trình điều khiển gốc 'libpq'." Vấn đề là, phân bổ chuỗi trong ruby thực sự khá tốn kém, có vẻ như lãng phí –
Tôi nghĩ rằng đó là vấn đề của hoàn cảnh cho dù đó là lãng phí hơn để phân bổ chuỗi cho mỗi cột hoặc cố gắng ánh xạ các loại PostgreSQL vào Ruby theo mặc định. Nếu tất cả các kiểu cột của bạn đều có các số tương đương có nguồn gốc chính xác (không phải BigNum) trong Ruby, có thể là lãng phí khi đại diện cho tất cả chúng như là các chuỗi. Tuy nhiên, dường như tôi vô trách nhiệm thực hiện những gì chỉ có thể là một hệ thống lập bản đồ kiểu hoàn chỉnh một phần dựa trên chất thải bộ nhớ tiềm ẩn trong hoàn cảnh tương đối hiếm hoi đó. –