Моделирование данных в Rails: Как установить отношения, когда 2 объекта "делятся" одним и тем же списком has_many?

В двух словах, когда я создаю Transaction Запись имеет два внешних ключа. для двух пользователей, которые участвуют в Transactionт.е.

Теперь, что я хотел бы узнать с вашей любезной помощью, это как мне установить отношения между: User а также Transaction Модели, так что я могу легко получить все Transactions для любого из двух Users.

Что-то вроде:

  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
}

Используйте полиморфные ассоциации, которые могут решить эту проблему. Я сейчас в поезде предоставлю вам код, или вы можете начать искать эту задачу и удачи;)

Другие вопросы по тегам