1

我有两个带有 hasMany / belongsTo 关联的 ActiveRecord 模型:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  belongs_to :user
end

User 模型有一个 revision_number 属性,我想将belongs_to 关联限定到该属性,因此该字母通过user.id 和user.revision_number 与用户相关联。

我尝试使用 API 文档中记录的 :conditions 键:

class Letter < ActiveRecord::Base
  belongs_to :user, :conditions => "revision_number = #{client_revision}"
end

但这试图在 Letter 类上调用 client-revision,而不是 Letter 的实例。任何人都可以指出正确的方向来正确确定belongs_to 关联的范围吗?

我正在使用acts-as-revisable插件对用户模型进行版本控制。

4

2 回答 2

0

我很难理解您为什么要以belongs_to这种方式确定范围。如果我错了,请纠正我,但做这样的事情可能会更好。我假设你想要某种版本控制系统:

class User < ActiveRecord::Base
  has_many :letters
end

class Letter < ActiveRecord::Base
  has_many :revisions, :class_name => "LetterVersion"
  belongs_to :current, :class_name => "LetterVersion"
end

class LetterVersion < ActiveRecord::Base
  belongs_to :letter
end
于 2009-07-29T15:21:08.013 回答
0

最后发现我需要的是像复合键这样的东西,Rails ActiveRecord 不支持。解决方案(至少现在)是在 Letter 上编写自定义客户端访问器以支持复合键(id 和 revision_number):

class Letter < ActiveRecord::Base
  def client
    Client.find_by_id(self.client_id).try(:find_revision, self.client_revision)
  end

  def client=(c)
    self.client_id = c.id
    self.client_revision = c.revision_number
  end
end

class Client < ActiveRecord::Base
  acts_as_revisable

  has_many :letters
end

使用此设置,Client#1.letters 将检索两个字母的数组,但 Letter#2.client 将检索 Client#1r2,而 Letter#2.client 将检索 Client#1r4:

Client         id:    1    1    1    1    1    1
       rev_number:    1    2    3    4    5    6

Letter         id:         1              2
        client_id:         1              1
  client_revision:         2              5

仍然不确定这是否是解决这个问题的最佳方法,但它现在似乎有效。

于 2009-07-31T09:18:16.580 回答