Rails has_many 通过特定 id
Rails has_many through with specific id
我正在尝试创建以下内容:
模型:用户、账户、交易
Logic: 用户有多个账户。帐户有很多交易。用户通过账户进行了多次交易。
型号
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")
但是当涉及到交易时,使用相同的逻辑:
user = User.create(name: "John")
user.accounts.create(account_id: "123")
accounts.transactions.create(account_id: "123", amount: 10)
我收到一个错误
NoMethodError: undefined method transactions for Account
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
belongs_to :account 将创建一个名为 account_id 的列,但您在上面的行中已经有 account_id。将 t.string :account_id
更改为 t.string :account_name
。一般来说,我只对外键使用_id。
这里有几个问题,
在帐户和交易中,您都有一个字符串列 account_id。在交易中,账户的外键默认也是account_id?
因此您可能必须为此保留一个差异名称。
并且您正在调用 accounts.transactions,每个帐户都有很多交易,因此应该在单个帐户对象上调用交易。(Accounts.last.transactions 或类似)
而且我没有看到在任何地方定义帐户(我假设您没有 post 那部分代码。
)
我正在尝试创建以下内容:
模型:用户、账户、交易 Logic: 用户有多个账户。帐户有很多交易。用户通过账户进行了多次交易。
型号
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")
但是当涉及到交易时,使用相同的逻辑:
user = User.create(name: "John")
user.accounts.create(account_id: "123")
accounts.transactions.create(account_id: "123", amount: 10)
我收到一个错误
NoMethodError: undefined method transactions for Account
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
belongs_to :account 将创建一个名为 account_id 的列,但您在上面的行中已经有 account_id。将 t.string :account_id
更改为 t.string :account_name
。一般来说,我只对外键使用_id。
这里有几个问题,
在帐户和交易中,您都有一个字符串列 account_id。在交易中,账户的外键默认也是account_id?
因此您可能必须为此保留一个差异名称。
并且您正在调用 accounts.transactions,每个帐户都有很多交易,因此应该在单个帐户对象上调用交易。(Accounts.last.transactions 或类似)
而且我没有看到在任何地方定义帐户(我假设您没有 post 那部分代码。 )