我想在视图Rails中使用模型属性

时间:2016-04-03 16:48:01

标签: ruby-on-rails ruby activerecord activemodel rails-models

我正在尝试在模型中使用属性值,但它不起作用.. 我有三种模式:

模型/ 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. 我应该如何在每个其他视图中使用相关的模型属性?

1 个答案:

答案 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。但是如果没有对您的应用有更深入的了解,很难提出任何替代方案。