如何设置此 has_many 关联?
How do I setup this has_many association?
所以我有一个 PortStock
模型,它具有 action: buy
和 action: sell
枚举属性。每个 PortStock
可以是 position: open
或 position: closed
(也是枚举值)。
但是,关闭一个 PortStock
的是另一个 PortStock
(即 PortStock.sell
关闭 PortStock.buy
)。
所以我创建了一个名为 ClosedPositions
的连接模型,基本上我想做的是记录一个 PortStock
由另一个关闭时的元数据。
这是我的 ClosedPosition.rb
模型的架构和模型:
# == Schema Information
#
# Table name: closed_positions
#
# id :bigint(8) not null, primary key
# closer_id :integer
# closed_id :integer
# num_units :integer
# closed_price :float
# dollar_change :float
# percent_change :float
# ticker :string
# created_at :datetime not null
# updated_at :datetime not null
#
class ClosedPosition < ApplicationRecord
belongs_to :closer, class_name: "PortStock", foreign_key: "closer_id"
belongs_to :closed, class_name: "PortStock", foreign_key: "closed_id"
end
在我的 PortStock
模型上,我有一个简单的 has_many :closed_positions
。
但是,当我尝试将 closed_position
添加到现有 port_stock
对象时,出现 unknown attribute port_stock_id
错误。
[27] pry(main)> closer = PortStock.find(8)
PortStock Load (0.4ms) SELECT "port_stocks".* FROM "port_stocks" WHERE "port_stocks"."id" = LIMIT [["id", 8], ["LIMIT", 1]]
=> #<PortStock:0x00007fc951a47c30
id: 8,
portfolio_id: 1,
stock_id: 84,
volume: 250,
purchase_price: 4.1,
current_price: 4.0,
percent_change: -2.43902439024389,
created_at: Tue, 12 Jun 2018 00:46:09 UTC +00:00,
updated_at: Tue, 12 Jun 2018 00:46:09 UTC +00:00,
current_value: 1000.0,
dollar_change: -24.9999999999999,
total_spend: 1025.0,
bought_on: Sat, 09 Jun 2018 00:00:00 UTC +00:00,
action: "sell",
position: "open",
ticker: "KEY">
[28] pry(main)> closed = PortStock.find(5)
PortStock Load (0.7ms) SELECT "port_stocks".* FROM "port_stocks" WHERE "port_stocks"."id" = LIMIT [["id", 5], ["LIMIT", 1]]
=> #<PortStock:0x00007fc951a55858
id: 5,
portfolio_id: 1,
stock_id: 84,
volume: 250,
purchase_price: 4.1,
current_price: 4.0,
percent_change: -2.43902439024389,
created_at: Mon, 11 Jun 2018 03:11:10 UTC +00:00,
updated_at: Mon, 11 Jun 2018 23:28:30 UTC +00:00,
current_value: 1000.0,
dollar_change: -24.9999999999999,
total_spend: 1025.0,
bought_on: Sat, 09 Jun 2018 00:00:00 UTC +00:00,
action: "buy",
position: "open",
ticker: "KEY">
[34] pry(main)> closer.closed_positions.create(closed: closed, num_units: closer.volume, closed_price: closed.stock.price, ticker: closed.ticker)
Stock Load (1.7ms) SELECT "stocks".* FROM "stocks" WHERE "stocks"."id" = LIMIT [["id", 84], ["LIMIT", 1]]
(0.2ms) BEGIN
(0.3ms) ROLLBACK
ActiveModel::UnknownAttributeError: unknown attribute 'port_stock_id' for ClosedPosition.
from /.rvm/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/activemodel-5.2.0/lib/active_model/attribute_assignment.rb:53:in `_assign_attribute'
[35] pry(main)> closer.closed_positions.create(closed_id: closed.id, num_units: closer.volume, closed_price: closed.stock.price, ticker: closed.ticker)
(0.2ms) BEGIN
(0.3ms) ROLLBACK
ActiveModel::UnknownAttributeError: unknown attribute 'port_stock_id' for ClosedPosition.
from /.rvm/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/activemodel-5.2.0/lib/active_model/attribute_assignment.rb:53:in `_assign_attribute'
我该如何解决这个问题?
我接近这个了吗?我可能搞砸了关联语法和逻辑。
当您尝试创建 closed_positions 记录时,ActiveRecord 假定存在外键 port_stock_id
,但在本例中不存在。所以尝试下面的解决方案添加可能的关联。我添加了两者(我不知道它在当前上下文中的相关性)。这样您就可以创建关联记录。
class PortStock < ApplicationRecord
has_many :closed_stock_positions, foreign_key: 'closed_id', class_name: 'ClosedPosition'
has_many :closer_stock_positions, foreign_key: 'closer_id', class_name: 'ClosedPosition'
end
ActiveRecord 抱怨的是我的 ClosedPosition
模型上没有 port_stock_id
列。
所以,我只是将列 closed_id
重命名为 port_stock_id
,然后我将 ClosedPosition
模型中的关联从:
更改为
class ClosedPosition < ApplicationRecord
belongs_to :closed, class_name: "PortStock", foreign_key: "closed_id"
end
收件人:
class ClosedPosition < ApplicationRecord
belongs_to :closed, class_name: "PortStock", foreign_key: "port_stock_id"
end
现在很有魅力。
所以我有一个 PortStock
模型,它具有 action: buy
和 action: sell
枚举属性。每个 PortStock
可以是 position: open
或 position: closed
(也是枚举值)。
但是,关闭一个 PortStock
的是另一个 PortStock
(即 PortStock.sell
关闭 PortStock.buy
)。
所以我创建了一个名为 ClosedPositions
的连接模型,基本上我想做的是记录一个 PortStock
由另一个关闭时的元数据。
这是我的 ClosedPosition.rb
模型的架构和模型:
# == Schema Information
#
# Table name: closed_positions
#
# id :bigint(8) not null, primary key
# closer_id :integer
# closed_id :integer
# num_units :integer
# closed_price :float
# dollar_change :float
# percent_change :float
# ticker :string
# created_at :datetime not null
# updated_at :datetime not null
#
class ClosedPosition < ApplicationRecord
belongs_to :closer, class_name: "PortStock", foreign_key: "closer_id"
belongs_to :closed, class_name: "PortStock", foreign_key: "closed_id"
end
在我的 PortStock
模型上,我有一个简单的 has_many :closed_positions
。
但是,当我尝试将 closed_position
添加到现有 port_stock
对象时,出现 unknown attribute port_stock_id
错误。
[27] pry(main)> closer = PortStock.find(8)
PortStock Load (0.4ms) SELECT "port_stocks".* FROM "port_stocks" WHERE "port_stocks"."id" = LIMIT [["id", 8], ["LIMIT", 1]]
=> #<PortStock:0x00007fc951a47c30
id: 8,
portfolio_id: 1,
stock_id: 84,
volume: 250,
purchase_price: 4.1,
current_price: 4.0,
percent_change: -2.43902439024389,
created_at: Tue, 12 Jun 2018 00:46:09 UTC +00:00,
updated_at: Tue, 12 Jun 2018 00:46:09 UTC +00:00,
current_value: 1000.0,
dollar_change: -24.9999999999999,
total_spend: 1025.0,
bought_on: Sat, 09 Jun 2018 00:00:00 UTC +00:00,
action: "sell",
position: "open",
ticker: "KEY">
[28] pry(main)> closed = PortStock.find(5)
PortStock Load (0.7ms) SELECT "port_stocks".* FROM "port_stocks" WHERE "port_stocks"."id" = LIMIT [["id", 5], ["LIMIT", 1]]
=> #<PortStock:0x00007fc951a55858
id: 5,
portfolio_id: 1,
stock_id: 84,
volume: 250,
purchase_price: 4.1,
current_price: 4.0,
percent_change: -2.43902439024389,
created_at: Mon, 11 Jun 2018 03:11:10 UTC +00:00,
updated_at: Mon, 11 Jun 2018 23:28:30 UTC +00:00,
current_value: 1000.0,
dollar_change: -24.9999999999999,
total_spend: 1025.0,
bought_on: Sat, 09 Jun 2018 00:00:00 UTC +00:00,
action: "buy",
position: "open",
ticker: "KEY">
[34] pry(main)> closer.closed_positions.create(closed: closed, num_units: closer.volume, closed_price: closed.stock.price, ticker: closed.ticker)
Stock Load (1.7ms) SELECT "stocks".* FROM "stocks" WHERE "stocks"."id" = LIMIT [["id", 84], ["LIMIT", 1]]
(0.2ms) BEGIN
(0.3ms) ROLLBACK
ActiveModel::UnknownAttributeError: unknown attribute 'port_stock_id' for ClosedPosition.
from /.rvm/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/activemodel-5.2.0/lib/active_model/attribute_assignment.rb:53:in `_assign_attribute'
[35] pry(main)> closer.closed_positions.create(closed_id: closed.id, num_units: closer.volume, closed_price: closed.stock.price, ticker: closed.ticker)
(0.2ms) BEGIN
(0.3ms) ROLLBACK
ActiveModel::UnknownAttributeError: unknown attribute 'port_stock_id' for ClosedPosition.
from /.rvm/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/activemodel-5.2.0/lib/active_model/attribute_assignment.rb:53:in `_assign_attribute'
我该如何解决这个问题?
我接近这个了吗?我可能搞砸了关联语法和逻辑。
当您尝试创建 closed_positions 记录时,ActiveRecord 假定存在外键 port_stock_id
,但在本例中不存在。所以尝试下面的解决方案添加可能的关联。我添加了两者(我不知道它在当前上下文中的相关性)。这样您就可以创建关联记录。
class PortStock < ApplicationRecord
has_many :closed_stock_positions, foreign_key: 'closed_id', class_name: 'ClosedPosition'
has_many :closer_stock_positions, foreign_key: 'closer_id', class_name: 'ClosedPosition'
end
ActiveRecord 抱怨的是我的 ClosedPosition
模型上没有 port_stock_id
列。
所以,我只是将列 closed_id
重命名为 port_stock_id
,然后我将 ClosedPosition
模型中的关联从:
class ClosedPosition < ApplicationRecord
belongs_to :closed, class_name: "PortStock", foreign_key: "closed_id"
end
收件人:
class ClosedPosition < ApplicationRecord
belongs_to :closed, class_name: "PortStock", foreign_key: "port_stock_id"
end
现在很有魅力。