我是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
工作?
答案 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