0

私は初心者ですが、連想データのクエリがどのように機能するかについて頭を悩ませようとしています。これが私の単純なスキーマです:

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

上記のセルの1つでmicroposts.authorのような属性を取得するにはどうすればよいですか?Microposts.users.nameにクエリを実行しようとしましたが、次のようなルビーオブジェクトデータが返されるようです。

[#<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仕事に取り掛かることができますか?

4

2 に答える 2

1
<%= micropost.user.name %>

呼び出しuserて関連付けられたユーザーに到達し、次に呼び出しnameてそのレコードのname属性を取得します。

于 2012-09-02T07:46:12.077 に答える
1

所属する関連付けは、(あなたの場合は)user_idをMicropostに保存することで機能します。これにより、マイクロポストが属するユーザーを次のように参照できます。

micropost.user

この時点で、名前などのユーザー属性にアクセスできます。

micropost.user.name

編集

さらに2つのこと:

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モデルに宣言を含めることは、micropostからユーザーを作成する(またはユーザーを検索する)ことを意図していることを意味します。あなたのユースケースでは不要だと思います。

2)ユーザーを「作成者」としてエイリアスする場合は、Micropostのbelongs_to呼び出しを次のように置き換えることができます。

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

これにより、次のように作成者名を照会できます。

micropost.author.name
于 2012-09-02T07:48:50.103 に答える