代码之家  ›  专栏  ›  技术社区  ›  Chris Blunt

使用ActiveRecord属于两个键

  •  1
  • Chris Blunt  · 技术社区  · 16 年前

    class User < ActiveRecord::Base
      has_many :letters
    end
    
    class Letter < ActiveRecord::Base
      belongs_to :user
    end
    

    用户模型有一个revision\u number属性,我想将其范围限定为“归属于”关联,因此字母通过User.id和User.revision\u编号与用户关联。

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

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

    我在用电话 acts-as-revisable 插件版本的用户模型。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Blake Chambers    16 年前

    我很难理解您为什么要确定 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
    
        2
  •  0
  •   Chris Blunt    16 年前

    最后我发现我需要的是复合键,Rails ActiveRecord不支持。解决方案(至少现在)是在字母上写自定义客户端访问器,以支持组合键(id和修订号):

    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
    

    仍然不确定这是否是解决这个问题的最佳方法,但目前看来似乎有效。