在我的Rails应用程序中,我确实有SQlite3用于开发,而PostgreSQL用于生产。我有一个属于类别和类别的习惯类有很多习惯。因此,为了让用户搜索任何类别以查看相关习惯,我在习惯模型中开发了一个类方法,该方法进入数据库并根据搜索的类别找到所有习惯。
所以,如果我写,
def self.search(search)
where("category_id LIKE ?", search)
end
它在开发中运行得非常好,但PostgreSQL在生产中给出了500错误说:
"没有运算符匹配给定的名称和参数类型。你可能会 需要添加显式类型转换。"
所以,我搜索了它并找到了解决方案(Pgsql error: You might need to add explicit type casts)并相应地编辑了我的方法:
def self.search(search)
where("category_id::text LIKE ?", search)
end
现在,它在预制方面完美无缺,但是SQlite在开发中给我一个错误说:
" SQLite3 :: SQLException:无法识别的令牌:":":SELECT"习惯"。* 来自"习惯"习惯"。" user_id" =? AND(category_id :: text LIKE ' 4')"
尝试了很多,但无法解决这个问题。有什么办法可以修改这个方法来处理这两个数据库吗?或者有什么方法可以告诉我的应用程序在哪种环境中使用哪种方法?
答案 0 :(得分:2)
也许只是我,但IMO没有必要在包含整数的列上使用LIKE
。因此,我只会使用正常的=
:
def self.search(search)
where("category_id = ?", search)
end
因为这不遵循常见的Rails习惯用法,让我们用哈希语法将其简化为where
并使用范围而不是类方法:
scope :search, ->(search) { where(category_id: search) }
可以从控制器中调用,如下所示:
Habit.search(params[:xyz])
答案 1 :(得分:1)
你可以在
上加上条件ActiveRecord::Base.connection.instance_values["config"][:adapter]
像
if ActiveRecord::Base.connection.instance_values["config"][:adapter] == "postgresql"
puts "I'm using postgres!"
elsif ActiveRecord::Base.connection.instance_values["config"][:adapter] == "sqlite3"
puts "I'm using sqlite!"
end
答案 2 :(得分:0)
让数据库适配器为您完成工作
def self.search(search)
where(category_id: search)
end