2017-02-25 5 views
0

私のモデルを馬鹿にして、物事が見逃されているように見える重要なものを表示しようとしました。多くの人が属性にアクセスできない

セッションのオーナーに私の見解では@session.ownerでアクセスしようとしています。オーナーは出席者に関連付けられ、すべての出席者はhas_manyを介してセッションに関連付けられます。

self.attendeesはレコードを返さないようです。私は明らかな何かが欠けていると確信しています。あなたが助けることができれば、事前に感謝します!あなたのケースでは

乾杯、 タイラー

セッションモデル

class Session < ApplicationRecord 
    has_many :attendees 

    def owner 
    self.attendees.each do |attendee| 
     if attendee.role == "Owner" 
     "#{attendee.user_id}" 
     end 
    end 
    end 

end 

出席者モデル

class Attendee < ApplicationRecord 
    belongs_to :session 

end 
+0

あなたは 'annotate' https://github.com/ctran/annotate_modelsを使用し、私達に、モデルのフィールドを表示してくださいすることができますを参照してください? –

答えて

1

目立つものがいくつかあります。まず、ownerメソッドを実装した方法は、各レコードを照会してロール属性を確認することはあまり効率的ではありません。関連付けは、Active Record Associationメソッドを使用して定義できます。例えば。アソシエーションを宣言するときにスコープを定義することができます。

あなたの問題を調査するためにそれは、session.attendeesはすべてのレコードを返さないされ、私は次のことをお勧めします。

  1. あなたはレールの慣習に従い、正しい参照列を持っていることを確認してください。 Attendeeのカラムはsession_idである必要があります。
  2. いくつかのスペックを書くか、少なくともレールコンソールをロードして、いくつかのテストレコードを作成し、いくつかのレコードが返されるのを見てhas_many :attendeesアソシエーションが期待通りに機能していることを確認します。これは、おそらくあなたのコードに関する問題を明らかにするでしょう。

次に、アクティブなレコードの関連付けを使用して、「セッション所有者」の関連付けを宣言します。 session.ownerは、出席者レコードまたはユーザーレコードを返す必要があります(この例では、出席者がユーザーに属していることを示していますか?)session.ownerが出席者レコードを返すと仮定すると、関連付けはhas_one :owner, -> { where role: 'Owner' }, class_name: 'Attendee'のようになります。 (これは未テストの例であることに注意してください)。 has_oneの団体の詳細については

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

あなたの洞察に感謝します。これは良い点です!私はさらに、他のセッションを同様の方法で定義することができると仮定します。session.admin、session.memberと同様ですか?また、ロールを単純に保つためのモデルは除外しました。私の出席者モデルには、ロールモデルを参照するrole_id列があります。それをどのようにリンクするかについてのより多くの洞察?私はちょうどどこに行くことができますrole_id == '1'ここで1は、別のSQL呼び出しから引き出されるか、それについて行く簡単な方法はありますか? – trowse

+0

はい、それを行うことができます。また、より複雑なロールの関連付けを処理するために関連スコープを調整することもできます。活発なレコード協会と遊び、あなたがそれを理解できるかどうかを見てください。アソシエーションスコープには、アクティブなレコードクエリーインターフェイスメソッドを含めることができます。 'has_one:owner、 - > {joins(:role).where(役割:{name: '所有者'})}' http://guides.rubyonrails.org/active_record_querying.htmlを参照してください。 – jverban

1

eachownerを見つけ、nilを返します後に作業を継続していきます。

class Session < ApplicationRecord 
    has_many :attendees 

    def owner 
    user_id = nil 
    self.attendees.each do |attendee| 
     if attendee.role == "Owner" 
     user_id = "#{attendee.user_id}" 
     break 
     end 
    end 

    user_id 
    end 

end 

私はownerを見つけるためにsqlアプローチを使用するようにコードを書き直しました。

class Session < ApplicationRecord 
    has_many :attendees 

    def owner 
    self.attendees.find_by(role: "Owner").try(:user_id) 
    end 
end 
+0

Hrm ...まだ運がありません。それは空白の値を返しています。私は、私のターミナルでSQLコマンドが正しく実行されているのを見ることができます。そして、私がワークベンチでそれを実行すると、レコードがそこにあります。それは私のアプリケーションの価値を与えることを望んでいない¯\\ _(ツ))/¯ – trowse

+0

これは最後に私のデータベースや私が選別した何かにいくつかの問題があった。 – trowse

+0

何をしているのかと何が返されているのかを考えるメソッドを命名するのがよい習慣であることは注目に値する。上記の例では、 'owner'メソッドは間違ったデータ型、つまりユーザIDを返します。 'session.owner'が所有者オブジェクトを返すので、' session.owner.name'のようなデイジーチェーンが可能です。 IDを返すつもりならば、メソッドは 'session.owner?id'と同様に' session.owner_id'という名前にする必要があります。 – jverban

関連する問題