폴리모픽 관련 기억
16165 단어 Rails4
다형성 관련이란 무엇입니까?
여러 부모를 가진 하위 테이블을 구현하는 관련 메커니즘
어떤 경우에 사용합니까?
예를 들어, Shop model과 User model에서 각각 Profile을 갖고 싶습니다.
갖게 하는 Profile의 내용이 완전히 같은 경우라든가
예를 들어, Shop model과 User model에서 각각 Profile을 갖고 싶습니다.
갖게 하는 Profile의 내용이 완전히 같은 경우라든가
그럴 때는 폴리모픽 관련을 사용하여 Shop model과 User model 모두를 부모로 하는 Profile model을 작성한다.
어떤 식으로 실현합니까?
사용자 모델 만들기
$ rails g scaffold name:string
프로필 모델 만들기
#{関連名}:references{polymorphic}
에서 폴리모픽 관련을 위한 컬럼 생성
$ rails g scaffold name:string
#{自model名}able
로 하는 경우가 많은 것 같다$ rails g model profile profilable:references{polymorphic} disription:string
migration 및 model 구현
이런 간지
db/migrate/20160621160304_create_profiles.rb
class CreateProfiles < ActiveRecord::Migration
def change
create_table :profiles do |t|
t.references :profilable, polymorphic: true, index: true
t.string :disription
t.timestamps null: false
end
end
end
app/models/profile.rb
class Profile < ActiveRecord::Base
belongs_to :profilable, polymorphic: true
end
app/models/user.rb
class User < ActiveRecord::Base
has_one :profile, :as => :profilable
end
데이터를 넣어보세요
u = User.create(name: 'aaa')
u.profile = Profile.create(disription: 'test')
profilable_type
: 부모 모델의 클래스명 profilable_id
: 부모 모델 ID sqlite> select * from users;
id name created_at updated_at
---------- ---------- -------------------------- --------------------------
1 aaa 2016-06-21 16:07:03.154460 2016-06-21 16:07:03.154460
sqlite> select * from profiles;
id profilable_id profilable_type disription created_at updated_at
---------- ------------- --------------- ---------- -------------------------- --------------------------
1 1 User test 2016-06-21 16:07:45.587894 2016-06-21 16:07:45.593233
Shop model도 생성
$ rails g model shop name:string
app/model/shop.rb
class Shop < ActiveRecord::Base
has_one :profile, :as => :profilable
end
데이터를 넣어보세요
s = Shop.create(name: 'aaa')
s.profile = Profile.create(disription: 'abc')
s = Shop.create(name: 'bbb')
s.profile = Profile.create(disription: 'abcd')
sqlite> select * from shops;
id name created_at updated_at
---------- ---------- -------------------------- --------------------------
1 aaa 2016-06-21 16:13:06.268592 2016-06-21 16:13:06.268592
2 bbb 2016-06-21 16:13:39.186536 2016-06-21 16:13:39.186536
sqlite> select * from profiles;
id profilable_id profilable_type disription created_at updated_at
---------- ------------- --------------- ---------- -------------------------- --------------------------
1 1 User test 2016-06-21 16:07:45.587894 2016-06-21 16:07:45.593233
2 1 Shop abc 2016-06-21 16:13:06.295915 2016-06-21 16:13:06.331801
3 2 Shop abcd 2016-06-21 16:13:44.673048 2016-06-21 16:13:44.680561
다형성 관련을 검색 할 때 어떤 쿼리가 발행 되었습니까?
Shop.find_by(name: 'bbb').profile.disription
profilable_type
와, profilable_id
로 SELECT 하고 있다 Shop Load (0.3ms) SELECT "shops".* FROM "shops" WHERE "shops"."name" = ? LIMIT 1 [["name", "bbb"]]
Profile Load (0.2ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."profilable_id" = ? AND "profiles"."profilable_type" = ? LIMIT 1 [["profilable_id", 2], ["profilable_type", "Shop"]]
=> "abcd"
자식에서 부모 모델에 액세스하는 방법
profilable
사용하기Profile.find_by(disription: 'abc').profilable.class.to_s # => Shop
코드
감상
참고
Reference
이 문제에 관하여(폴리모픽 관련 기억), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kasei-san/items/a9795de8a6558fbcff14텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)