다형성을 사용하여 Rails 4 앱의 중복을 줄이려고했지만 많은 행운이 없습니다. 개념적으로, 저는 컴퓨터를 가지고 있고 프린터를 가지고 있는데, 둘 다 장비라고 생각할 수 있다고 생각합니다. 이 항목은 소유자 또는 기능으로 할당되며 둘 다 소유자로 작동합니다. 또한 양육권 체인을 추적해야하기 때문에 일부 datetime 필드를 조인 테이블에 추가하면 원하는 모든 것을 성취 할 수 있습니다. 지금까지레일즈 4의 조인 테이블을 통한 이중 다형성 사용
코드 : 다형성 연결을 사용하는 방법에
class Facility < ActiveRecord::Base
has_many :computers, as: :equipment
has_many :printers, as: :equipment
belongs_to :owners, polymorphic: true
end
class Employee < ActiveRecord::Base
has_many :computers, as: :equipment
has_many :printers, as: :equipment
belongs_to :owners, polymorphic: true
end
class Computer < ActiveRecord::Base
belongs_to :equipment, polymorphic: true
has_many :facilities, as: :owners
has_many :employees, as: :owners
end
class Printer < ActiveRecord::Base
belongs_to :equipment, polymorphic: true
has_many :facilities, as: :owners
has_many :employees, as: :owners
end
# Join table structure
create_table "equipment_owners", force: true do |t|
t.integer "equipment_id"
t.string "equipment_type"
t.integer "owner_id"
t.string "owner_type"
t.datetime "possession_datetime"
t.datetime "relinquish_datetime"
t.datetime "created_at"
t.datetime "updated_at"
end
대부분의 예는 단수 (즉 Rails guide & Railscast #154가), 그래서 내가 최선을 다해 내가 할 수있는 그 구조를 따르도록 노력한다. 불행하게도, 레일 콘솔에서 연결을 테스트하는 오류를 보여줍니다
irb > Computer.find_by_id(9).facilities
Facility Load (0.2ms) SELECT "facilities".* FROM "facilities" WHERE "facilities"."owners_id" = ? AND "facilities"."owners_type" = ? [[nil, 9]]
SQLite3::SQLException: no such column: facilities.owners_id: SELECT "facilities".* FROM "facilities" WHERE "facilities"."owners_id" = ? AND "facilities"."owners_type" = ?
이 내가 EquipmentOwners 테이블에보고 액티브 말할 필요가 있음을 시사한다. 내가 has_many :facilities, as: :owners, through: :equipment_owners
내 has_many를 업데이트 할 경우 불행하게도, 나는 다음과 같은 오류 얻을 :
irb > Computer.find_by_id(9).facilities
Computer Load (0.4ms) SELECT "computers".* FROM "computers" WHERE "computers"."id" = 9
ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :equipment_owners in model Computer
사람이 제안 할 수이 일을 할 수있는 방법을, 또는 이것은 단지 내가 표준 레일 연결을 사용 할 수 넘어? 모든 테이블에 equipment_owner_id
을 만들 수있는 대답은 무엇입니까? 그것은 엉성한 것처럼 보이지만 그것은 현재 나의 유일한 생각입니다.
을 체크 아웃 할 수 http://stackoverflow.com/questions/555668/single-table- 계승 및 사용 장소 - 여기에 레일 – abhijit
위에 나열된 것과 다른 모델을 사용해도? 각 다형성 그룹에 속하는 데이터 필드의 중복은 결국 반대 그룹과 비슷한 관계를 갖더라도 최소한입니다. – IanL