Другие ответы говорят вам о том, что вам нужно сделать, но для новичков в Rails, как и для меня, может быть непонятно, как собрать все эти вещи вместе, так что вот полное решение, включая обе миграции.и Модели.
Также, как примечание: я предпочитаю Займы, Кредитора и Заемщика, а не Расход, Кредитор и Должник, или Долг, Кредитор и Должник.Главным образом потому, что Расходы неоднозначны, а Долг слишком похож на Должника.Но это не , что важно;просто делайте то, что имеет для вас смысл, поскольку вы будете поддерживать свой код.
Миграции
class CreateLoans < ActiveRecord::Migration
create_table :loans do |t|
def up
t.references :lender
t.references :borrower
end
end
end
Здесь вы указываете, что в этой таблице есть два столбца, которые будут называться: кредитор и: заемщик и которые содержат ссылки на другую таблицу.Rails фактически создаст для вас столбцы с именами lender_id и loaner_id.В нашем случае они будут ссылаться на строки в таблице Users, но мы указываем это в моделях, а не в миграциях.
Models
class Loan < ActiveRecord::Base
belongs_to :lender, class_name => 'User'
belongs_to :borrower, class_name => 'User'
end
Здесь вы создаете свойство для модели ссуды с именем: lender, а затем указываете, что это свойство связано с классом User.Rails, увидев «own_to», будет искать столбец в таблице ссуд под названием «lender_id», который мы определили выше, и использовать его для хранения внешнего ключа.Затем вы делаете то же самое для заемщика.
Это позволит вам получить доступ к вашему Кредитору и Заемщику, оба экземпляра модели User, через экземпляр модели Loan, например:
@loan.lender # Returns an instance of the User model
@loan.borrower.first_name # Returns a string, as you would expect
В качестве дополнительного примечания: номенклатура «принадлежат к» имеет приличный смысл в этом случае, но может привести к путанице в другом месте.Просто помните, что он всегда используется в зависимости от того, что содержит внешний ключ.
class User < ActiveRecord::Base
has_many :loans_as_lender, :class_name => 'Loan', :foreign_key => 'lender_id'
has_many :loans_as_borrower, :class_name => 'Loan', :foreign_key => 'borrower_id'
end
Здесь вы создаете свойство для модели User с именем: loan_as_lender, указывая, что это свойство связано с моделью Loan, ичто внешний ключ в модели Loan, который связывает его с этим свойством, называется lender_id.Затем вы делаете то же самое для: loan_as_borrower.
Это позволяет вам получить все кредиты, в которых пользователь является кредитором или заемщиком, например:
@address.loans_as_lender
@address.loans_as_borrower
Выполнение любого из этихвернет массив экземпляров модели Loan.