0

TrainingSession モデルからの最新のアクティビティを含むアクティビティ フィードを作成しようとしています。

class User
  has_many :training_sessions
end

class TrainingSession
  belongs_to :user
end

問題は、以下に示すように、TrainingSessions データベース テーブルからオブジェクトをインスタンス化することによって、ビュー ページでユーザーのデータ (主にユーザー名) にアクセスしようとしていることです。

<% @training_sessions.each do |training_session| %>
<%= training_session.user_id %>

問題は、ユーザーの ID を正常に取得できても、次のように呼び出すことができないことです。

training_session.user_id.name

...そうしないと、以下に示す NoMethodError が返されます。

undefined method `first_name' for 2:Fixnum

私の質問は... TrainingSessionのオブジェクトからユーザーのデータにアクセスするにはどうすればよいですか?

どんな助けでも大歓迎です。これにはかなり困惑しました。

4

3 に答える 3

3

「nil:NilClassの未定義のメソッド `name'」エラーが発生する理由は、一部のトレーニングセッションがユーザーに属していないためです。解決策は、データベースをクリーンアップすることです。

DELETE FROM training_sessions WHERE user_id IS NULL

ユーザーに属していないトレーニングセッションがあると予想される動作の場合は、ユーザーがnilループに参加していないことを確認する必要があります。

<% @training_sessions.each do |training_session| %>
  <% unless training_session.user.nil? %>
    <%= training_session.user.name %>
  <% end %>
<% end %>
于 2012-09-06T06:49:37.220 に答える
1

まず、モデル名 ( TreningSessions) を単数形の名前 ( )に変更する必要がありますTreningSession。それは、レールが使用する規則です。モデルのみ名前を変更し、has_many変更せずに残します。

ユーザーの関連付けは、オブジェクトを介して呼び出す必要がありuserます。user_idデータベース内のフィールドとその値を表す単なる属性でuserあり、関連オブジェクトです。これを試して:

training_session.user.name

ActiveRecord 関係の詳細

于 2012-08-29T18:16:24.900 に答える
0

次のように、user_id を含むローカル ユーザー変数を作成し、その変数をユーザー モデルの find メソッドで使用して、コントローラーでインスタンス変数 @training_session_user をインスタンス化します。

@training_sessions.each do |training_session|
  user = training_session.user_id
  @training_session_user = User.find(user)
end

次に、これを私の見解で呼び出します。

@training_session_user.first_name

エラーなしで名前を取得します。

誰かがより良い解決策を持っている場合は、お気軽にどうぞ。ただし、今のところ正しいとマークします。

于 2012-08-29T23:28:50.053 に答える