2017-04-25 6 views
-1

写真、投稿、コメントの3つのモデルがあります。写真には、多型関連のattachable_idとattachable_typeカラムがあります。投稿とコメントにそれぞれattachable_type値1,2を割り当てたいと思います。多形のレールでの疑問

私はコード

Photo.rb

belongs_to :attachable, polymorphic: true 

Post.rb

has_many :photos, -> { where(attachable_type: 1) }, as: :attachable, class_name: "Photo", dependent: :destroy 

Comment.rb

has_many :photos, -> { where(attachable_type: 2) }, as: :attachable, class_name: "Photo", dependent: :destroy 

次追加している。しかし、私は取得しようとすると、ポストusiの写真の数NG

self.photos.count 

生成されたクエリは、どのように私にはわからない

SELECT COUNT(*) FROM `photos` WHERE `photos`.`attachable_id` = 853 AND `photos`.`attachable_type` = 0 AND `photos`.`attachable_type` = 1 

photosです。 attachable_type = 0がクエリに追加されました。質問からこれを避けるように助けてください。

答えて

0

attachable_typeはで、integerではありません。

attachable_typeが1のときは、postに属し、polymorphicを使用する必要はありません。

polymorphicの使用は間違っています。attachable_typethe model's class nameである必要があります。例えば

2.3.1 :001 > Notification.last 
=> #<Notification id: 3733, notify_attachable_id: 489, 
notify_attachable_type: "Demander", created_at: "2017-04-10 
08:36:46", updated_at: "2017-04-10 08:36:46", already_read: false> 

チャンそれこの

Post.rb

has_many :photos, as: :attachable 

Comment.rb

has_many :photos, as: :attachable 

と、それは自動attachable_typeattachable_idフィールドを記入します。この方法で

post.photos.create(image_url: 'http://xx.jpg') 

を写真を作成します。

実際にタイプがintegerフィールドの場合は、Polymorphic Assocations using Integer ID type fieldsを参照してください。私の意見では、polymorphicを使用する必要はなく、いくつかのカスタムメソッドを書くだけです。単純です。

+0

私たちはattachable_typeをstringの代わりにtiny intとして使用できますか?私は列のサイズを最適化したい – CR7

+0

このhttps://github.com/doliveirakn/polymorphic_integer_typeをチェックしてください、しかし私はそれを前に使用していません。あなたがそれを小さなintにしたければ、カスタムコードを書く必要があります。正式にはサポートしていないため –