我對Rails還是比較新的,所以希望這不是一個愚蠢的問題。訪問has_one關聯的屬性
我有兩種模式:用戶和家務。用戶HAS_ONE苦差事,並家務屬於用戶
class User < ActiveRecord::Base
attr_accessible :chore_done, :email, :name, :phone
has_one :chore
class Chore < ActiveRecord::Base
attr_accessible :name, :user_id
belongs_to :user
在我的用戶指標,我想展示的所有用戶,並顯示與他或她相關的苦差事。我通過傳遞User.all到視圖和使用。每次通過每個用戶重複這樣做:
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.chore.name %></td>
<td><%= user.chore_done? %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
不幸的是,我無法訪問家務的name屬性。我得到這個錯誤:
undefined method `name' for nil:NilClass
如果我刪除了.name屬性,它只是返回一個指向Chore對象的指針。
我有一種感覺,這與將User.all對象傳遞給視圖然後迭代該視圖有關。只需在控制檯中訪問特定的User對象(例如User.find(1)),然後訪問user.chore.name就可以正常工作。
1.9.3-p194 :045 > user = User.find(4)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 4]]
=> #<User id: 4, name: "Example User", email: "[email protected]", phone: 8675309, chore_done: false, created_at: "2012-11-05 01:53:33", updated_at: "2012-11-05 01:53:33">
1.9.3-p194 :046 > user.chore.name
Chore Load (0.3ms) SELECT "chores".* FROM "chores" WHERE "chores"."user_id" = 4 LIMIT 1
=> "Living room"
我在APIDock上讀了一些關於AssociationProxy的內容,但我不認爲我完全理解它,也不知道如何使用它。從我收集的信息中,訪問模型中的所有對象都會返回一個對象數組,但不會爲其依賴關係返回一組完整的屬性?因此,在這種情況下,我得到一個指向Chore對象的指針,但沒有訪問它的任何屬性。
我當然可以在我的用戶表中添加Chore作爲另一列,但我可能在將來添加到該模型+我只是想弄清楚has_one關聯是如何工作的。
任何幫助表示讚賞!
啊!這很有道理。我做得比現在複雜得多。只是分解你寫的東西......我之前在rails中沒有看到過這種語法(第二個問號),但它看起來與SQL查詢非常相似。涼! – jasdeepg
它被稱爲**三元操作符**。 (條件)? 「true case」:「false case」' – deefour
時髦的方式來避免使用rails的三元組:'user.chore.try(:name)'http://apidock.com/rails/Object/try –