如何在我的视图中获取关联的属性?

时间:2012-09-02 07:43:35

标签: ruby-on-rails activerecord associations

我是rails noob,仍然试图围绕查询关联数据的工作方式。这是我的简单架构:

  create_table "microposts", :force => true do |t|
    t.text     "content"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

我的协会如下:

class Micropost < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :user
    accepts_nested_attributes_for :user
end

class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_many :microposts
  accepts_nested_attributes_for :microposts
end

我要做的是查询我的微博,使其包含与用户表中用户名称相对应的作者属性。这是我的HTML:

<% @microposts.each do |micropost| %>
  <tr>
    <td><%= micropost.content %></td>
    <td><%= micropost.user_id %></td>
    <td>
      **<%= micropost.author %>**
    </td>
    <td><%= link_to 'Show', micropost %></td>
    <td><%= link_to 'Edit', edit_micropost_path(micropost) %></td>
    <td><%= link_to 'Destroy', micropost, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

如何在上面的一个单元格中获取像microposts.author这样的属性?我尝试查询Microposts.users.name但它似乎返回ruby对象数据,如下所示:

[#<Micropost id: 1, content: "Though good for getting a general overview of Rails...", user_id: 2, created_at: "2012-09-02 01:52:47", updated_at: "2012-09-02 01:52:47">, #<Micropost id: 2, content: "This is another", user_id: 2, created_at: "2012-09-02 01:53:09", updated_at: "2012-09-02 01:53:09">, #<Micropost id: 3, content: "A close cousin of create_table is change_table, 

还有什么数据不包含用户名数据。我究竟做错了什么?如何让micropost.author工作?

2 个答案:

答案 0 :(得分:1)

<%= micropost.user.name %>

您致电user以联系相关用户,然后致电name以获取该记录的name属性。

答案 1 :(得分:1)

belongs_to关联通过在Micropost中存储(在您的情况下)user_id来工作。这允许您像这样引用Micropost所属的用户:

micropost.user

此时您可以访问任何用户属性,例如名称:

micropost.user.name

修改

还有两件事:

1)accepts_nested_attributes_for声明通常在父类中进行。它们为您提供了如下调用的能力:

# when creating, it infers the user_id attribute thanks to the nested attribute declaration
user.microposts.create(content: "blah blah")

# similarly, user_id is inferred here as well
user.microposts.where( ... ) 

在Micropost模型中包含声明意味着您打算从微博中创建用户(或搜索一个用户)。我认为在您的用例中不必要。

2)如果你想将用户别名为“author”,你可以用Micropost替换Micropost中的belongs_to调用:

belongs_to :author, class_name: "User", foreign_key: "user_id"

这将允许您按如下方式查询作者姓名:

micropost.author.name