相关疑难解决方法(0)

线程安全:Ruby中的类变量

在Ruby中对类变量执行写入/读取不是线程安全的.对实例变量执行写入/读取似乎是线程安全的.也就是说,对类或元类对象的实例变量执行写/读是否是线程安全的?

在线程安全方面,这三个(人为的)示例之间有什么区别?

例1: 相互排斥

class BestUser # (singleton class)
  @@instance_lock = Mutex.new

  # Memoize instance
  def self.instance
    @@instance_lock.synchronize do
      @@instance ||= best
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

例2: 实例变量存储

class BestUser # (singleton class)
  # Memoize instance
  def self.instance
    @instance ||= best
  end
end
Run Code Online (Sandbox Code Playgroud)

例3: 在METACLASS上安装可变存储器

class BestUser # (singleton class)
  # Memoize instance
  class << self
    def instance
      @instance ||= best
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby multithreading metaprogramming thread-safety ruby-1.9.2

39
推荐指数
3
解决办法
2万
查看次数

在 ActiveRecord 中急切加载关联时 JOIN ON ... AND 条件

请注意,这不是一个关于向关联添加 WHERE 条件的问题,而是一个关于在使用 eager_load 时如何更改 JOIN 子句的相当高级的问题。

假设我有这些模型

class Parent
  has_many :children
  have_many :grades, through: :children
end

class Child
  belongs_to :parent
end

class Grade
  belongs_to :child
end
Run Code Online (Sandbox Code Playgroud)

因此,为了急切地加载父母,我会这样做:

Parent.eager_load(:grades)
Run Code Online (Sandbox Code Playgroud)

但如果我想要所有的父母 - 但只是渴望加载最高分,如下所示:

LEFT OUTER JOIN grades ON grades.child_id = children.id AND grades.level = 'A+'
Run Code Online (Sandbox Code Playgroud)

我尝试过使用includes(:children).joins("LEFT OUTER JOIN grades ON grades.child_id = children.id AND grades.level = 'A+'"),但由于 Rails 不构建关联对象,因此会导致对每个父级进行额外的查询。

我还没有找到任何关于使用eager_load自定义 SQL 字符串的参考资料,并且已经深入研究了源代码,但没有得到任何更明智的结果。

activerecord ruby-on-rails ruby-on-rails-4

3
推荐指数
1
解决办法
801
查看次数