2017-11-09 51 views
0

私は(比較的)簡単なRailsアプリケーションを持っています。私は3つのモデル、評価、ユーザーとチームを持っています。チームには多くのユーザーがおり、各ユーザーは評価を受けることができます。ここではモデルの切断型およびそれらに関連するスキーマは、以下のとおりです。Railsで1対1の関係を持つ奇妙さ

​​
class User < ApplicationRecord 
    has_one :assessment 
    belongs_to :team, optional: true 
end 


create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.string "name" 
    t.string "organisation_type" 
    t.string "position" 
    t.string "location" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "team_id" 
    t.string "locale", default: "en", null: false 
end 

class Team < ApplicationRecord 
    has_many :users 
    has_many :assessments, through: :users  
end 

create_table "teams", force: :cascade do |t| 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

私は評価(team.users.where(assessment: nil)を持っていないチーム内のすべてのユーザーを取得しようとします)次のエラーが表示されます。

ActiveRecord::StatementInvalid: 
    PG::UndefinedColumn: ERROR: column users.user_id does not exist 
    LINE 1: ...".* FROM "users" WHERE "users"."team_id" = $1 AND "users"."u... 
                   ^
    : SELECT "users".* FROM "users" WHERE "users"."team_id" = $1 AND "users"."user_id" IS NULL 

そして得られたSQL、エラーが示唆するように、少しおかしくあり:

SELECT "users".* FROM "users" WHERE "users"."team_id" = $1 AND "users"."user_id" IS NULL 

そして、私は評価が存在しない場合には評価からユーザーを取得しようとすると、それはnilを返します。

私は本当にここで何かをやっていると思うが、だれでも助けることができるのだろうか?

+0

評価のないチームのユーザには、 'team.users.includes(:assessment).where(assessment:{id:nil})'を試すことができます。 – MrYoshiji

+0

スキーマを修正して機能させることができます。ユーザーテーブルに 'assesment_id'列を追加し、評価表から 'user_id'を削除してください。上記のコードは正常に動作するはずです。 –

+0

いいえ。まだ何も。私は評価にユーザーを当てはめることはできません。私は '不明な属性' user_id'を書くことができません – Pezholio

答えて

1

は、あなたの質問で説明したものから始めて、私は、クエリの仕事の上にするために行われた変更は、次のとおりです。

  1. アセスメントテーブルから 'user_id'列を削除します。
  2. ユーザーテーブルに列 'assessment_id'を追加します。
  3. ユーザーモデルからhas_one :assessmentを削除し、ユーザーモデルにbelongs_to :assessmentを追加します。
  4. アセスメントモデルからを削除し、アセスメントモデルにhas_one :userを追加します。

注意する点は、a.user = uu.assessment = aではなく変更をコミットすることだけです。 (aは評価、uはユーザ)。

+0

クール、応答のために感謝します。私は対処したくないもう1つの巨大なワームを開いたので、上記の応答に行くことに決めました!私はupvoted、それはまだ有効な応答です:) – Pezholio

関連する問題