4

adminパネルにrails_adminを使用しています。ただ、モデルがActiveRecord :: StatementInvalid PG :: UndefinedColumn:ERROR

class User < ApplicationRecord 
    has_many :images,dependent: :destroy 
end 

私は管理者からユーザーを編集しようとすると、このエラーを得ているこの

class Image < ApplicationRecord 
    has_one :user 
    has_one :product 
end 

とユーザーにこの

class Image < ApplicationRecord 
    belongs_to :user 
    belongs_to :product 
end 

からイメージモデルに

を関連付けを変更反対側からはうまくいきます。

ActiveRecord::StatementInvalid at /user/72/edit 

PG::UndefinedColumn: ERROR: column users.image_id does not exist 
LINE 1: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1... 
             ^
: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1 LIMIT $2 

答えて

1

Railsには素晴らしいドキュメントがあります。 has_onefound hereのドキュメントでは、「このメソッドは他のクラスに外部キーが含まれている場合にのみ使用する必要があります。」というメッセージがあるため、userレコードの外部キーがimage_idを探しています。これは移行によって作成されます。外部キーと移行の詳細については、stack overflow postを参照してください。

しかし、あなたがそこまで行く前に、ご検討ください。

  • は、なぜあなたは 最初の場所でhas_one :userからbelongs_to :userからの画像の関係を変更するのでしょうか? SQLの関連付けと、Railsがそれらにどのようにマップするかを煮詰めるには、ユーザhas_many :imagesが必要ならば、画像は必ず belong_toユーザでなければなりません。それらは関係の反対側であり、の例外はhas_and_belongs_to_manyの関係になります。 AがBに属している場合、Bには1つ(または多く)のAが含まれています。画像はbelongs_toの関係にしておくことを強くお勧めします。ユーザーと商品にはhave_manyの画像があります。なぜこれが理にかなっているかを逸話的に説明すると、ユーザーは自分の顔や家などのプロフィール写真を持っているかもしれません(has_many :images)。製品(靴)には同じ靴(has_many :images)の写真が複数ある場合がありますが、靴の特定の写真がユーザーと商品の両方にマッピングされることはほとんどありません。
  • attachinaryまたはpaperclipのような宝石を使用して画像や添付ファイルを管理することを強くお勧めします。アップロードされた添付ファイルを扱っている場合、このようなライブラリは、サイズ変更、イメージ圧縮などに関して頭痛を軽減します。関係を変更しようとするあなたの方向は、これらの宝石があなたのために解決します。
+0

私はあなたの説明を理解していますが、ユーザーと製品の両方に単一のイメージテーブルを使用しています。ユーザーイメージは、new_userおよびedit_userの時点で保存され、製品と同じです。ユーザーは最大3つの画像を持つことができます。ユーザーと製品はこのユーザーのような直接関係はありません - >ストア - >製品。しかし、私はあなたと私の両方のためにbelongs_toを使用している私のidsは私がしたくない画像テーブルに必要です。ユーザが画像テーブル内の画像よりも画像を保存する場合、product_idはnullであり、逆もまた同様であり、これはbelongs_toの場合には起こらない。 –

+0

それは理にかなっており、1つの画像テーブルは良いデザインです。この場合、 "entity、entity_id、image_id"という列の交差テーブルが必要な場合があります。エンティティはクラス名とIDなので、行は "User、1、2"のようになります。 2はimage_idです。 Attachinaryのようなものを使用することをお勧めします。Attachinaryは、このセットアップのすべてを処理します。 – quetzaluz

+0

もう1つの注意点は、「has_many」には「through:」宣言も必要であるということです。その詳細はこちら:http://guides.rubyonrails.org/association_basicshtml#the-has-many-through-association – quetzaluz

関連する問題