Ruby on rails Rails数据建模:当两个对象“共享”同一个列表时,如何建立关系?

Ruby on rails Rails数据建模:当两个对象“共享”同一个列表时,如何建立关系?,ruby-on-rails,ruby,rails-activerecord,activerecord-relation,Ruby On Rails,Ruby,Rails Activerecord,Activerecord Relation,简而言之,当我创建一个事务记录时,它有两个外键。对于参与交易的两个用户,即: 现在,在您的帮助下,我想知道的是,如何建立用户和事务模型之间的关系,以便我可以轻松地检索两个用户中任何一个的所有事务 比如: user_one = User.find(1) user_two = User.find(2) user_one.transactions # returns all Transactions where user_one.id ==

简而言之,当我创建一个事务记录时,它有两个外键。对于参与交易的两个用户,即:

现在,在您的帮助下,我想知道的是,如何建立用户和事务模型之间的关系,以便我可以轻松地检索两个用户中任何一个的所有事务

比如:

  user_one = User.find(1)
  user_two = User.find(2)

  user_one.transactions # returns all Transactions where user_one.id == 
                        # user_one_id Or user_one.id == user_two_id

  user_two.transactions # returns all Transactions where user_two.id == 
                        # user_one_id Or user_two.id == user_two_id
实现这一目标的最佳方式是什么?在这种情况下,最好在事务模型中建立外键吗?或者这是一个只能通过ActiveRecordQuery解决的问题


提前感谢。

使用多病态关联可以解决此问题。我现在在列车上,将为您提供代码,或者您可以开始查找此任务,祝您好运

使用可以解决此问题的多病态关联,我现在在列车上,将为您提供代码,或者您可以开始查找此任务,祝您好运

如果您有两个用户ID,并且希望查询其中某个组合上的事务,则可以使用or子句:


如果您有两个用户ID,并且希望查询它们的某个组合上的事务,则可以使用or子句:

这是示例代码

class Transaction
  def move
    return ""
  end
end

class User1 < Transaction
  def move
    return 'User1 move: X'
  end
end


class User2 < Transaction
  def move
    return'User2 move: O'
  end
end



transactions = [User1.new, User2.new]
transactions.each {|tran|
  print tran.move
}
这是示例代码

class Transaction
  def move
    return ""
  end
end

class User1 < Transaction
  def move
    return 'User1 move: X'
  end
end


class User2 < Transaction
  def move
    return'User2 move: O'
  end
end



transactions = [User1.new, User2.new]
transactions.each {|tran|
  print tran.move
}

谢谢你的回复。我不确定多态关联如何适应这个问题,我可以问一些示例代码吗?那时候你当然可以提供。谢谢你的回复。我不确定多态关联如何适应这个问题,我可以问一些示例代码吗?那时候你当然可以提供。很酷,谢谢@Tom Copeland。但是它不应该是:Transaction.whereuser\u one\u id:1.orTransaction.whereuser\u two\u id:1吗?哦,你是对的-我误解了查询使用的是哪一组id。但是,是的,这似乎是一种方式,或者说是一种方式。这样就可以了,对吗?我想额外的问题可以归结为,我是否将user\u one\u id和user\u two\u id设置为外键?有必要吗?是的,通常我会使它们成为外键以保持引用完整性,当然,如果需要的话,你也可以使它们为空。你可以打赌-在创建表迁移中你可以做t。引用:user_one,foreign_key:{to_table::users}和t。引用:user_two,foreign_key:{to_table::users}。酷,谢谢@Tom Copeland。但是它不应该是:Transaction.whereuser\u one\u id:1.orTransaction.whereuser\u two\u id:1吗?哦,你是对的-我误解了查询使用的是哪一组id。但是,是的,这似乎是一种方式,或者说是一种方式。这样就可以了,对吗?我想额外的问题可以归结为,我是否将user\u one\u id和user\u two\u id设置为外键?有必要吗?是的,通常我会将它们设置为外键以保持引用完整性,当然,如果需要,您可以将它们设置为null。您可以打赌,在创建表迁移中,您可以执行t。引用:user_one,foreign_key:{to_table::users}和t。引用:user_two,foreign_key:{to_table::users}。