ruby-on-rails - 为什么列 trades.item_id 不存在?

标签 ruby-on-rails ruby postgresql has-many-through belongs-to

我有一个关系模型,其中两个用户可以进行交易以交换两个项目。

class User < ActiveRecord::Base
 has_many :owned_items, class_name: "Item"
 has_many :trades_received, class_name: "Trade", through: :owned_items, source: :trades
 has_many :trades
 has_many :wanted_items, class_name: "Item", through: :trades, source: :item
end

class Item < ActiveRecord::Base
 belongs_to :owner, class_name: "User", foreign_key: :user_id
 has_many :trades, dependent: :destroy
 has_many :trade_requesters, through: :trades
 has_many :trade_recipients, through: :trades
end

class Trade < ActiveRecord::Base
 belongs_to :trade_requester, class_name: "User"
 belongs_to :trade_recipient, class_name: "User"
 belongs_to :wanted_item, class_name: "Item", foreign_key: :wanted_item_id
 belongs_to :collateral_item, class_name: "Item", foreign_key: :collateral_item_id
end

我的 Trades 表上的迁移如下所示:

create_table :trades do |t|
 t.belongs_to :trade_requester
 t.belongs_to :trade_recipient
 t.belongs_to :wanted_item
 t.belongs_to :collateral_item
end

堆栈跟踪指向我用来列出所有交易请求的辅助方法。该行表示 @trades = current_user.trades_received.requested.count,然后向下到 User 上的模型关联,其中 has_many :owned_items, class_name: "Item"。根据我的理解,它看起来像 trades_received 方法,它被称为 through: :owned_itemssource::trades 应该引用 :wanted_item_id 迁移中的外键。但事实并非如此。如果我创建一个迁移以添加 item_id,它会起作用,但是一个 Trade 需要两个项目,所以我将它分成两个 wanted_itemcollat​​eral_item协会。我如何设置该用户关联,以便它引用另一个用户正在请求的项目? Items has_many :trades 应该是我拥有的方式,还是应该 Items belongs_to :trades

完整错误:

PG::UndefinedColumn: ERROR:  column trades.item_id does not exist
LINE 1: ...LECT COUNT(*) FROM "trades" INNER JOIN "items" ON "trades"."...
                                                         ^
: SELECT COUNT(*) FROM "trades" INNER JOIN "items" ON "trades"."item_id" = "items"."id" WHERE "items"."user_id" = $1 AND "trades"."approved" IS NULL

tldr:我需要跟踪一堆复杂的 has_many :through 关联,我认为我的数据模型不正确,需要帮助理解原因。谢谢。

最佳答案

你在 UserItem 之间建立了两个 has_many :through 关系,以 Trade 作为加入两者的表。你有一些关系混淆。这是基于您的迁移的设置:

class User < ActiveRecord::Base
 has_many :received_trades, class_name: "Trade", foreign_key: "trade_recipient"
 has_many :requested_trades, class_name: "Trade", foreign_key: "trade_requester"
 has_many :collateral_items, through: :received_trades
 has_many :wanted_items, through: :requested_trades
end

class Item < ActiveRecord::Base
 has_many :collateral_items, class_name: "Trade", foreign_key: "collateral_item"
 has_many :wanted_items, class_name: "Trade", foreign_key: "wanted_item"
 has_many :trade_requesters, through: :wanted_items
 has_many :trade_recipients, through: :collateral_items
end

class Trade < ActiveRecord::Base
 belongs_to :trade_requester, class_name: "User"
 belongs_to :trade_recipient, class_name: "User"
 belongs_to :wanted_item, class_name: "Item"
 belongs_to :collateral_item, class_name: "Item"
end

##migration
create_table :trades do |t|
 t.belongs_to :trade_requester
 t.belongs_to :trade_recipient
 t.belongs_to :wanted_item
 t.belongs_to :collateral_item
end

一些解释:

Item has_many :collateral_item  ## item_id in table collateral_items
Item has_many :collateral_item, class_name: "Trade", foreign_key: "collateral_item"
##collateral_item_id in trades table.

关于ruby-on-rails - 为什么列 trades.item_id 不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045484/

相关文章:

ruby-on-rails - 通过字符串引用对象属性

sql - 在 Postgres 中搜索加密字段

sql - PostgreSQL 整数数组值使用 desc 字符串连接到其他表中的整数

javascript - haml 模板中的 JS 语句

ruby-on-rails - 当 find 涉及单个属性但 create 涉及多个属性时实现 find_or_create_by

ruby-on-rails - 图像的 Rails 3.1 绝对 URL

ruby - 为什么我不能在 Ruby 代码块中重新分配变量?

sql - JSONB 性能随着键数的增加而降低

javascript - Rails + JQuery : Getting to a sibling div from script

ruby-on-rails - 如何使 ActiveModel 成为散列或数组?