我有以下声明:
Customer.where(city_id: cities)
Run Code Online (Sandbox Code Playgroud)
这导致以下SQL语句:
SELECT customers.* FROM customers WHERE customers.city_id IN (SELECT cities.id FROM cities...
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?它在某处记录了吗?我不会使用上面的Rails代码,而是使用以下之一:
Customer.where(city_id: cities.pluck(:id))
Run Code Online (Sandbox Code Playgroud)
要么
Customer.where(city: cities)
Run Code Online (Sandbox Code Playgroud)
这导致完全相同的SQL语句.
我目前面临的问题是,我的所有对象都使用具有“相同”初始值的实例变量,而我只读了这个。
def initialize
@available_ids = read_only_value
end
Run Code Online (Sandbox Code Playgroud)
但棘手的事情来了:这个“read_only_value”是从 API 检索的。为了简单起见,我们假设该值是一个整数数组,并且每月更改一次。
但我不想通过每次创建对象时检索值来拒绝 API。如果我改用类变量怎么办?
class Foo
@@available_ids = read_only_value
def initialize
@available_ids = @@available_ids //weird but let's go with it
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这将解决 API 垃圾邮件的问题,因为它仅在变量初始化后执行...
但这种情况什么时候发生呢?当我启动 Rails 应用程序时,当我创建第一个对象时?它会更新吗?由于该值每月更改一次,我如何获取更新?
PS:我想最好的选择是将 ids 保存在数据库中,并偶尔或按需检查 ids。