【问题标题】:check Relationship table on model, ruby on rails检查模型上的关系表,轨道上的红宝石
【发布时间】:2014-02-18 16:15:28
【问题描述】:

我在 Rails 3.2.14 上有 ruby​​ 项目。我有 2 个名为“国家”和“用户”的表。在“用户”表中有名为“countries_id”的 FK。 在模型上,我使表关系如下: 在countries.rb 我设置了如下关系:

class Countries < ActiveRecord::Base
  self.primary_key = "id"
  has_many  :users,  :dependent => :destroy # plural
end

在 users.rb 中像:

class Users < ActiveRecord::Base
  self.primary_key = "id"


  belongs_to    :countries,
                :class_name => "Countries",
                :foreign_key => "countries_id"

end

当我想检查复数关系时,它没有.. 我像下面一样输入rails控制台命令

c=Countries.find_by_id(1)

然后当我输入命令 u=c.users 时,我有一些错误 错误:

c=Countries.find_by_id(1)
  Countries Load (0.3ms)  SELECT `countries`.* FROM `countries` WHERE `countries`.`id` = 1 LIMIT 1
 => #<Countries id: 1, code: "IND", name: "Indonesia", created_at: "2014-02-17 09:18:11", updated_at: "2014-02-17 09:18:11"> 
1.9.3-p484 :012 > u=c.users
NameError: uninitialized constant Countries::User
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/inheritance.rb:111:in `compute_type'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/reflection.rb:172:in `klass'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/associations/association.rb:118:in `klass'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/associations/association.rb:171:in `find_target?'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/associations/collection_association.rb:334:in `load_target'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/associations/collection_proxy.rb:44:in `load_target'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/activerecord-3.2.14/lib/active_record/associations/collection_proxy.rb:87:in `method_missing'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/railties-3.2.14/lib/rails/commands/console.rb:47:in `start'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/railties-3.2.14/lib/rails/commands/console.rb:8:in `start'
    from /home/vinra/.rvm/gems/ruby-1.9.3-p484@rails3.2/gems/railties-3.2.14/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
1.9.3-p484 :013 > ^C
1.9.3-p484 :013 >

我真的希望有人知道我的问题, 无论如何谢谢你,对不起我的英语不好:)

【问题讨论】:

  • 请遵循 Rails 命名约定 型号名称不应为复数
  • 什么意思,可以更具体点吗?

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

你应该在你的代码中改变很多东西:

app/models/country.rb

class Country < ActiveRecord::Base
    has_many :users, :dependent => :destroy
end

app/models/user.rb

class Users < ActiveRecord::Base
    belongs_to :country,
               :foreign_key => "countries_id"
end

并像这样使用它:

country = Country.find(1)
p country.users

【讨论】:

  • 为什么我必须使用类名“国家”我已经创建了名为国家的 g 模型,并且在数据库中我的表也命名为国家,有什么不同?不管怎样,谢谢你的回答
  • rails 中的所有模型都应该是 Singular。所以你也需要重命名你的表。
【解决方案2】:

问题是 Rails Active Record 模型不能是复数。您使用复数创建了模型,因此将它们更改为单数或更好的方法是使用单数名称再次创建它们。

Countries 应该是 CountryUsers 应该是 User

有关命名约定的更多信息,请参阅This

希望对你有帮助!

【讨论】:

  • 感谢您的回答,我必须从头开始重建我的项目吗?或者我可以从迁移中编辑名称表和模型?
  • 首先尝试将您的模型名称编辑为单数并检查。如果它不起作用,那么您必须使用单数名称再次创建它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多