2017-04-05 42 views
0

編輯我仍然遇到顯示程序的問題。我有大學的名字顯示正確,但由於程序屬於大學,我仍然無法讓這些顯示正確。用戶表有一個program_id,但我仍然無法讓它工作。正確的用戶關聯多個模型

我對Rails相當陌生,並且遇到了我尚未遇到的情況。

我有三種模式:用戶,大學和程序。我希望用戶能夠選擇一所大學和一個計劃,但每所大學必須能夠擁有多個計劃,而計劃必須針對每所大學。 (例如籃子編織可能不在大學A,但在大學B可用)。如果這對於這個問題很重要,我也使用Filterrific gem。

我一直在尋找has_one:通過關聯,並覺得我有95%的路,但只是不能完全到達那裏!

class User < ActiveRecord::Base 
    has_one :university 
    has_one :program, through: :university 
end 

class University < ActiveRecord::Base 
    belongs_to :program 
    has_many :users, :through => :programs 
end 

class Program < ActiveRecord::Base 
    belongs_to :university 
    belongs_to :user 
end 

我的具體問題是,與用戶的特定的大學和程序顯示一個表時,我只得到了ID,而不是特定的大學/程序的名稱。而且 - 我不知道這是相關或完全獨立的 - 但是當我看向編輯用戶,我收到錯誤ActiveRecord::StatementInvalid at /users/6/edit PG::UndefinedColumn: ERROR: column universities.user_id does not exist

這是使用這個問題

我的看法是這樣的:

<% @users.each do |user| %> 
    <tr> 
     <td class='center'><%= link_to(user.full_name, user_path(user)) %></td> 
     <td class='center'><%= user.email %></td> 
     <td class='center'><%= user.role.capitalize %></td> 
     <td class='center'><%= user.program_id %></td> <-- Error 
     <td class='center'><%= user.university_id %></td> <-- Error 
    </tr> 
<% end %> 

用戶編輯視圖:

<%= form_for(@user) do |f| %> 
    <div class="field"> 
     <%= f.label :full_name %><br /> 
     <%= f.text_field :full_name %> 
    </div> 
    <div class="field"> 
     <%= f.label :email %><br /> 
     <%= f.email_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :university %><br> 
     <%= f.select :university, options_from_collection_for_select(University.all, 'id', 'name'), {include_blank: true}, {:class => 'select2'} %> 
    </div> 
    <div class="field"> 
     <%= f.label :program %><br> 
     <%= f.select :program, options_from_collection_for_select(Program.all, 'id', 'name'), {include_blank: true}, {:class => 'select2'} %> 
    </div> 
    <div class="actions"> 
     <%= f.submit 'Submit', :class => 'btn btn-trilogy' %> 
    </div> 
<% end %> 

我的用戶控制器

class UsersController < ApplicationController 
    def index 
     @filterrific = initialize_filterrific(
      User, 
      params[:filterrific], 
      :select_options => { 
       sorted_by: User.options_for_sorted_by, 
       with_university_id: University.options_for_select, 
       with_program_id: Program.options_for_select, 
      } 
     ) or return 
     @users = @filterrific.find.page(params[:page]) 

     respond_to do |format| 
      format.html 
      format.js 
     end 
    end 

最後我的模式

ActiveRecord::Schema.define(version: 20170404205100) do 

    enable_extension "plpgsql" 

    create_table "programs", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "universities", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", force: true do |t| 
    t.string "email",     default: "",     null: false 
    t.string "encrypted_password",  default: "",     null: false 
    t.integer "role" 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0,      null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.datetime "created_at",            null: false 
    t.datetime "updated_at",            null: false 
    t.string "full_name" 
    t.integer "university_id" 
    t.string "time_zone" 
    t.integer "program_id" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 

end 

請原諒我,如果有一些代碼丟失,你需要看到。請讓我知道,我不會經常在這裏發帖!

2.3.3 :006 > university.users 
NoMethodError: undefined method `klass' for nil:NilClass 
Did you mean? class 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:537:in `source_reflection' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:728:in `derive_class_name' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:176:in `class_name' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:728:in `derive_class_name' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:176:in `class_name' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/reflection.rb:221:in `klass' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/associations/association.rb:118:in `klass' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/associations/collection_association.rb:41:in `reader' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activerecord-4.1.9/lib/active_record/associations/builder/association.rb:110:in `users' 
    from (irb):6 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/railties-4.1.9/lib/rails/commands/console.rb:90:in `start' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/railties-4.1.9/lib/rails/commands/console.rb:9:in `start' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/railties-4.1.9/lib/rails/commands/commands_tasks.rb:69:in `console' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/railties-4.1.9/lib/rails/commands/commands_tasks.rb:40:in `run_command!' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/railties-4.1.9/lib/rails/commands.rb:17:in `<top (required)>' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:247:in `require' 
... 4 levels... 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:241:in `load' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:241:in `block in load' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:232:in `load_dependency' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:241:in `load' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/commands/rails.rb:6:in `call' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/command_wrapper.rb:38:in `call' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:183:in `block in serve' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:156:in `fork' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:156:in `serve' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:131:in `block in run' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:125:in `loop' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application.rb:125:in `run' 
    from /Users/jimmiejackson/.rvm/gems/ruby-2.3.3/gems/spring-1.3.6/lib/spring/application/boot.rb:18:in `<top (required)>' 
    from /Users/jimmiejackson/.rvm/rubies/ruby-2.3.3/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from /Users/jimmiejackson/.rvm/rubies/ruby-2.3.3/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from -e:1:in `<main>' 
+1

你可以發佈你的用戶編輯代碼來幫助調試你提到的第二個問題。 –

+0

使用用戶編輯代碼編輯我的文章。 –

+1

你可以發佈你的schema.rb文件嗎?看看你的數據庫設置是什麼會很有幫助。 –

回答

1

根據你如何描述你應該更新你的模型項目:

class University < ActiveRecord::Base 
    has_many :programs 
    has_many :users, :through => :programs 
end 

class Program < ActiveRecord::Base 
    belongs_to :university 
    has_many :users 
end 

class User < ActiveRecord::Base 
    has_one :program 
    has_one :university, through: :program 
end 

這樣你就可以通過學校的具體程序,如果你希望用戶只有一個計劃,他將有BTW一個大學通過該計劃。

希望它可以幫助...

+0

所以這樣的事情,我可以打電話,例如 <%= user.program%> 這似乎沒有工作出於某種原因,我得到'ActiveRecord :: StatementInvalid at/users PG :: UndefinedColumn:ERROR:column programs.user_id does not exist'錯誤。 –

0

我會推薦車型之間的不同類型的關係

class University < ActiveRecord::Base 
    has_and_belongs_to_many :programs 
    has_many :users 
end 

class Program < ActiveRecord::Base 
    has_and_belongs_to_many :universities 
    has_many :users 
end 

class User < ActiveRecord::Base 
    has_one :program 
    has_one :university 
end 

這樣可以防止數據repeatation同時說明程序或大學。關係在生成的組合表中進行管理。 我們獲得了大學之間的多對多關係,因爲它可以有多個程序,一個程序可以由多所大學運行。 這種關係是可縮放的,即一所大學的具體程序可以通過其他

用法稍後可打開會像

user.university 
user.program 
university.programs 
university.users 
program.universities 
program.users 

等。 希望這會有所幫助..

+0

我一直在閱讀HABTM不是首選的路線,而是has_many:通過關聯更好。這可能只是那些取決於你與誰交談的事情之一。 –

+0

是的你是對的,但在這裏你有大學和程序之間的多對多關係,都與用戶有一對一的關係。除非您創建特定的自定義表格/模型,否則HABTM是一個可行的解決方案。 – Mayank

+0

當我嘗試了這一點,我得到了錯誤 'ActiveRecord :: StatementInvalid at/users PG :: UndefinedColumn:錯誤:列studentss.user_id不存在' –

0

最後弄明白了。如果有其他人遇到類似問題,我會發布我的答案。

class University < ActiveRecord::Base 
    has_many :programs 
    has_many :users, through: :programs 
end 

class Program < ActiveRecord::Base 
    belongs_to :university 
    has_many :users, through: :university 
end 

class User < ActiveRecord::Base 
    belongs_to :university 
    belongs_to :program 
end