Rails 数据建模:当 2 个对象 "Share" 相同 has_many 列表时如何建立关系?
Rails Data Modelling: How to establish relationships when 2 Objects "Share" the same has_many list?
简而言之,当我创建一个 Transaction
记录时,它有两个 外键 。对于参与 Transaction
的两个用户,即:
现在,在您的帮助下,我想知道的是如何在 User
和 [=14= 之间建立 关系 ] 模型,这样我就可以轻松检索两个 User
中任何一个的所有 Transaction
。
类似于:
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 并且想要查询 Transaction
它们的某种组合,您可以使用 or
子句:
>> Transaction.where(user_one_id: 1).or(Transaction.where(user_two_id: 2))
Transaction Load (4.3ms) SELECT "transactions".* FROM "transactions" WHERE ("transactions"."user_one_id" = OR "transactions"."user_two_id" = ) LIMIT [["user_one_id", 1], ["user_two_id", 2], ["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Transaction id: 1, user_one_id: 1, user_two_id: 2, created_at: "2017-09-12 23:25:39", updated_at: "2017-09-12 23:25:39">]>
这是示例代码
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
}
简而言之,当我创建一个 Transaction
记录时,它有两个 外键 。对于参与 Transaction
的两个用户,即:
现在,在您的帮助下,我想知道的是如何在 User
和 [=14= 之间建立 关系 ] 模型,这样我就可以轻松检索两个 User
中任何一个的所有 Transaction
。
类似于:
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 并且想要查询 Transaction
它们的某种组合,您可以使用 or
子句:
>> Transaction.where(user_one_id: 1).or(Transaction.where(user_two_id: 2))
Transaction Load (4.3ms) SELECT "transactions".* FROM "transactions" WHERE ("transactions"."user_one_id" = OR "transactions"."user_two_id" = ) LIMIT [["user_one_id", 1], ["user_two_id", 2], ["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Transaction id: 1, user_one_id: 1, user_two_id: 2, created_at: "2017-09-12 23:25:39", updated_at: "2017-09-12 23:25:39">]>
这是示例代码
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
}