Rails 3如何从belongs_to:user association中的user_id列访问用户数据

时间:2012-08-29 18:14:13

标签: ruby-on-rails-3 associations

我正在尝试使用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的对象中访问用户的数据?

任何帮助将不胜感激。非常难过这个。

3 个答案:

答案 0 :(得分:3)

你得到一个&#34;未定义的方法`name&#39;对于nil:NilClass&#34; -error是一些训练课程不属于用户。解决方案是清理数据库:

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 %>

答案 1 :(得分:1)

首先,您需要将模型名称(TreningSessions)重命名为单数名称(TreningSession)。这是rails使用的惯例。仅重命名模型,不加更改has_many

现在是用户关联,您应该通过user对象调用它。 user_id只是表示数据库中字段及其值的属性,而user是一个关联对象。试试这个:

training_session.user.name

More on ActiveRecord relations

答案 2 :(得分: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

并检索没有错误的名称。

如果有人有更好的解决方案,请随意,但我现在将此标记为正确。