Ruby on rails 4 默认情况下,我是否可以使用“急加载”使关联成为“所属”?

Ruby on rails 4 默认情况下,我是否可以使用“急加载”使关联成为“所属”?,ruby-on-rails-4,eager-loading,belongs-to,Ruby On Rails 4,Eager Loading,Belongs To,我正在连接到我公司的一个SQL Server数据库,并尝试设置ActiveRecord,以便将它们与Rails对象一样对待 我有这两种型号: class Change < ActiveRecord::Base belongs_to :affected_contact, class_name: "Contact" end class Contact # Contact's primary key is a binary UUID; I can't change this end

我正在连接到我公司的一个SQL Server数据库,并尝试设置ActiveRecord,以便将它们与Rails对象一样对待

我有这两种型号:

class Change < ActiveRecord::Base
  belongs_to :affected_contact, class_name: "Contact"
end

class Contact
  # Contact's primary key is a binary UUID; I can't change this
end
我正试图获得一个特定变更的受影响联系人。通常情况下,这是一个简单的情况,但:

Change.first.affected_contact
  Change Load (52.6ms)  EXEC sp_executesql N'SELECT TOP (1) [chg].* FROM [chg] ORDER BY [chg].[id] ASC'
  Contact Load (28.0ms)  EXEC sp_executesql N'SELECT TOP (1) [ca_contact].* FROM [ca_contact] WHERE [ca_contact].[contact_uuid] = @0', N'@0 binary', @0 = 0xfcf9a8ac6381aa4386c9b10ee382e10b  [["contact_uuid", "<16 bytes of binary data>"]]
=> nil
。。。那不是我想要的!但是,如果我先加载联接,它会起作用:

Change.eager_load(:affected_contact).first.affected_contact
  SQL (34.4ms)  EXEC sp_executesql N'SELECT TOP (1) holy_crap_theres_a_lot_of_columns FROM [chg] LEFT OUTER JOIN [ca_contact] ON [ca_contact].[contact_uuid] = [chg].[affected_contact] ORDER BY [chg].[id] ASC'
=> #<Contact contact_uuid: "\xFC\xF9\xA8\xACc\x81\xAAC\x86\xC9\xB1\x0E\xE3\x82\xE1\v", ... >
事实上,如果我强制以任何方式在JOIN子句中进行匹配,它都会起作用,但它似乎使用WHERE子句,而nil是我在很多时候都能得到的最佳响应,字符串与其二进制类型之间存在转换错误

有没有办法确保默认情况下,通过JOIN子句在“属于”关联上进行紧急加载?

使用includes应该可以解决您的问题。这是因为Include将根据您的其他条件预加载或预加载

我发现find_by_contact_uuid contact_uuid作为主键起作用,而find由于某种原因没有起作用。这导致了这一计划的实施

我最终基本上重写了Active Record提供的关联方法:

module AssociationMethods
  def self.included(base)
    base.reflect_on_all_associations(:belong_to).each do |a|
      define_method a.name do
        # #find_by_<uuid_pk> seems to work where #find doesn't
        a.klass.send "find_by_#{a.association_primary_key}", self[a.foreign_key]
      end
    end

    base.reflect_on_all_associations(:has_many).each do |a|
      define_method a.name do
        a.klass.where(a.foreign_key => self.send(a.association_primary_key))
      end
    end
  end
end

class Contact
  has_many :changes, foreign_key: :affected_contact_id
  include AssociationMethods # include *after* all associations are defined
end

class Change
  belongs_to :affected_contact, class_name: 'Contact'
  include AssociationMethods
end
它并没有涵盖Active Record在设置关联时提供的所有功能,但它似乎做到了这一点。

这不是我的问题。我需要使用一个连接查询,因为uuid很难在WHERE子句中传递。但我如何定义“属于”关联来实现这一点?我想说change.infected\u contact,而不是change.whereid:change.id.eager\u load:infected\u contact.first.infected\u contact.Hi Sameera。我算在你的职位上。如果你是说因为,你会用它吗?我们这里有很多人的母语不是英语,我担心我们在教他们,讨厌的短信实际上是真话。