두 명의 사용자가 두 품목을 교환하기 위해 거래를 체결 할 수있는 관계 모델이 있습니다. 내 거래 테이블에열 trades.item_id가 존재하지 않는 이유는 무엇입니까?
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
마이그레이션 은 다음과 같습니다
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
라고 말하고, 사용자의 모델 연결은 has_many :owned_items, class_name: "Item"
입니다. 내 이해에 따라 trades_received
메서드는 through: :owned_items
이고 source: :trades
은 이동 중에 외래 키 :wanted_item_id
을 참조해야합니다. 그러나 그렇지 않습니다. item_id
을 추가하기 위해 이전을 만들었지 만 Trade에서 두 항목이 필요하므로 두 개의 wanted_item
및 collateral_item
연관으로 나누었습니다. 다른 사용자가 요청한 항목을 참조하도록 해당 사용자 연결을 어떻게 설정합니까? 항목 has_many :trades
, 내가 가지고있는 방법해야합니까 또는 항목 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
협회의 무리를 추적 할 필요가, 내 데이터 모델이 올바른지 생각하고 이유를 이해하는 데 도움이 필요하지 않습니다. 고맙습니다.
'사용자 has_many : trades_received'. 그래서 그것은'current_user.trades_receiveds'이어야합니다. 아마도'received_trades'로 변경하는 것이 좋습니다. 그리고'# requested' 메소드는 무엇입니까? 어떤 정확한 줄로 오류가 발생합니까? – EJ2015
'requested'는 범위이며, 단지'scope : requested, -> {where (approved : nil)}'입니다. 내 오류는 내 머리글에서 사용하는 도우미에서 발생하며 사용자 모델의': trades_received' 연결로 이동합니다[email protected]는 내 설정이 Trade와 Item 사이에 직접적인 연결 고리가 없었기 때문에 발생한다고 제안했습니다. – sabaeus
@sabaeus 데이터베이스 스키마 파일을 붙여 넣을 수 있습니다 – krishnar