我正在尝试在模型中使用属性值,但它不起作用.. 我有三种模式:
模型/ resident.rb
class Resident < ActiveRecord::Base
belongs_to :hostel
has_one :user,dependent: :delete
end
模型/ user.rb
class User < ActiveRecord::Base
belongs_to:resident
end
模型/ hostel.rb
class Hostel < ActiveRecord::Base
has_many :residents
has_one :rate_card,dependent: :delete
end
模式
驻地
create_table "residents", force: :cascade do |t|
t.string "room_number"
t.string "roll_number"
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "hostel_id"
end
用户
create_table "users", force: :cascade do |t|
t.string "roll_number"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "resident_id"
end
旅馆
create_table "hostels", force: :cascade do |t|
t.string "hostel"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
现在我想在 users / show.html.erb 中使用hostel属性值 我能够做到这一点:
<%if @user.resident.roll_number=="101303110"%>
如果存在滚动编号,则返回 true .. 但如果使用:
<%if @user.resident.hostel=="J"%>
如果J是宿舍模型中的宿舍,则返回 false 。
但是当我们将<%@user.resident.hostel%>
放入show.html.erb时,它显示的是价值J.
我应该如何在每个其他视图中使用相关的模型属性?
答案 0 :(得分:1)
鉴于您的关联,@user.resident.hostel
会加载宿舍。但您想比较hostel
上的hostel
字符串。因此,您的比较应该是:
<% if @user.resident.hostel.hostel == 'J' %>
说明:
@user # returns your a user
@user.resident # follows `belongs_to :resident` and
# returns a resident
@user.resident.hostel # follows `belongs_to :hostel` on the resident and
# returns a hostel
@user.resident.hostel.hostel # returns the value store in the `hostel`
# column of that `hostel`
顺便说一下。我认为链接这样的调用会违反Law of Demeter。但是如果没有对您的应用有更深入的了解,很难提出任何替代方案。