Rails has_many через с указанием c id - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать следующее:

Модели : пользователь, учетная запись, транзакция логи c: у пользователя много учетных записей. Счета имеет много транзакций. У пользователя много транзакций через аккаунты.

МОДЕЛИ

class User < ApplicationRecord
  has_many :accounts
  has_many :transactions, :through => :accounts
End

class Account < ApplicationRecord
  belongs_to :user
  has_many :transactions
end

class Transaction < ApplicationRecord
  belongs_to :account
end

МИГРАЦИИ

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end
end

class CreateAccounts < ActiveRecord::Migration[5.0]
  def change
    create_table :accounts do |t|
      t.string :account_id
      t.belongs_to :user, index:true
      t.timestamps
    end
  end
end

class CreateTransactions < ActiveRecord::Migration[5.0]
  def change
    create_table :transactions do |t|
      t.string :account_id
      t.decimal :amount, :precision => 8, :scale => 2
      t.belongs_to :account, index:true
      t.timestamps
    end
  end
end

Я могу создать учетную запись для пользователя со следующим кодом:

user = User.create(name: "John")
user.accounts.create(account_id: "123")

Но когда дело доходит до транзакций, используя те же логи c:

user = User.create(name: "John")
user.accounts.create(account_id: "123")
accounts.transactions.create(account_id: "123", amount: 10)

Я получаю ошибку

NoMethodError: неопределенные транзакции метода для учетной записи

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

У меня есть несколько проблем здесь,

В обоих аккаунтах и ​​транзакциях есть строковый столбец account_id. В транзакции внешний ключ к учетной записи будет также account_id по умолчанию?

, поэтому вам может потребоваться сохранить для этого имя diff.

И вы вызываете account.transactions, каждая учетная запись имеет много транзакций, поэтому транзакции следует вызывать для одного объекта учетной записи. (Accounts.last.transactions или тому подобное)

И я не вижу, чтобы где-либо определялись учетные записи (я предполагаю, что вы не опубликовали эту часть кода.)

0 голосов
/ 03 апреля 2020
class CreateTransactions < ActiveRecord::Migration[5.0]
  def change
    create_table :transactions do |t|
      t.string :account_id
      t.belongs_to :account, index:true
    end
  end
end

own_to: account создаст столбец с именем account_id, но у вас уже есть account_id в строке выше. изменить t.string :account_id на t.string :account_name. В общем, я использую _id только для внешних ключей.

...