Моделирование данных в Rails: Как установить отношения, когда 2 объекта "делятся" одним и тем же списком has_many?
В двух словах, когда я создаю Transaction
Запись имеет два внешних ключа. для двух пользователей, которые участвуют в Transaction
т.е.
Теперь, что я хотел бы узнать с вашей любезной помощью, это как мне установить отношения между: User
а также Transaction
Модели, так что я могу легко получить все Transaction
s для любого из двух User
s.
Что-то вроде:
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
только?
Заранее спасибо.
3 ответа
Если у вас есть два идентификатора пользователя и вы хотите запросить 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" = $1 OR "transactions"."user_two_id" = $2) LIMIT $3 [["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
}
Используйте полиморфные ассоциации, которые могут решить эту проблему. Я сейчас в поезде предоставлю вам код, или вы можете начать искать эту задачу и удачи;)