【问题标题】:How do I setup this has_many association?如何设置这个 has_many 关联?
【发布时间】:2018-06-13 00:45:31
【问题描述】:

所以我有一个PortStock 模型,它具有action: buyaction: sell 枚举属性。每个PortStock 可以是position: openposition: 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" = $1 LIMIT $2  [["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" = $1 LIMIT $2  [["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" = $1 LIMIT $2  [["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'

我该如何解决这个问题?

我接近这个了吗?我可能弄乱了关联语法和逻辑。

【问题讨论】:

    标签: ruby-on-rails associations ruby-on-rails-5


    【解决方案1】:

    当您尝试创建 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

    【讨论】:

    • 就在你添加这个之前,我实际上已经想通了。我所要做的就是将我的ClosedPosition 列中的foreign_key 重命名为port_stock_id,然后相应地调整关联。现在添加一个答案。不过感谢您的努力!您的解决方案看起来可行,但我尚未对其进行测试,因为我已经进行了迁移。
    【解决方案2】:

    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
    

    现在就像一个魅力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多