如何在rails控制台中访问关系表

时间:2014-07-09 19:31:57

标签: ruby-on-rails rails-console

如何在rails控制台中访问数据库的关系表UserRole

架构:

ActiveRecord::Schema.define(version: 20140709163149) do
  create_table "users", force: true do |t|
    t.string   "stuff"
    ...
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "roles", force: true do |t|
    t.string   "label"
    ...
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "user_roles", force: true do |t|
    t.integer  "user_id"
    t.integer  "role_id"
    ...
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "user_roles", ["role_id"], name: "index_user_roles_on_role_id"
  add_index "user_roles", ["user_id"], name: "index_user_roles_on_user_id"

在rails控制台中,我可以User.all()并获取所有用户,我可以Role.all(),但如何访问关系表user_role?最终我可以为数据库播种。

如果我尝试UserRole.all(),我会收到以下信息:

NameError: uninitialized constant UserRole
    from (irb):7
    from /Users/dejanew/.rvm/gems/ruby-2.1.1@global/gems/railties-4.1.1/lib/rails/commands/console.rb:90:in `start'
    from /Users/dejanew/.rvm/gems/ruby-2.1.1@global/gems/railties-4.1.1/lib/rails/commands/console.rb:9:in `start'
    from /Users/dejanew/.rvm/gems/ruby-2.1.1@global/gems/railties-4.1.1/lib/rails/commands/commands_tasks.rb:69:in `console'
    from /Users/dejanew/.rvm/gems/ruby-2.1.1@global/gems/railties-4.1.1/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
    from /Users/dejanew/.rvm/gems/ruby-2.1.1@global/gems/railties-4.1.1/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/dejanew/Dropbox/dev/SDF/bin/rails:8:in `<top (required)>'
    from /Users/dejanew/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Users/dejanew/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'

3 个答案:

答案 0 :(得分:1)

您需要在UserRole中定义名为app/models/user_role.rb的模型。

当您使用User.all()Roll.all()时,您将分别访问app/models/user.rbapp/models/role.rb中定义的类(可能)。您通过Rails控制台中提供的一些语法糖直接访问表,您只需使用应用程序代码定义的普通旧类。您需要对UserRole执行相同操作。

答案 1 :(得分:1)

用户和角色不是数据库表。他们的模型,这是Rails中使用的一个词,意思是继承自ActiveRecord :: Base的Ruby类。

您在rails generate中键入(或使用class User < ActiveRecord::Base ... end/app/models/user.rb生成时定义了用户模型。 Rails自动将用户和角色模型挂钩到usersroles表,但这是(出于我们的目的)巧合。存在用户和角色是因为在/app/models中定义了具有这些名称的类,而不是因为存在名为usersroles的数据库表。

如果您想拥有一个名为UserRole的模型,您必须定义它。您可以通过创建(或生成)/users/models/user_role.rb并将class UserRole < ActiveRecord::Base ... end放入其中来实现这一目标。

答案 2 :(得分:1)

希望这是一个简单的解决方案。

您的app/models目录应该有user.rbuser_role.rbrole.rb

user_role.rb看起来像这样:

class UserRole < ActiveRecord::Base belongs_to :user belongs_to :role end

另请注意,type的{​​{1}}字段可能会触发single table inheritance