【问题标题】:ActiveRecord association methods not being added to modelActiveRecord 关联方法未添加到模型中
【发布时间】:2013-01-13 08:25:12
【问题描述】:

我不得不围绕一个不符合“Rails 方式”的遗留 PostgreSQL 数据库构建一个 Rails 应用程序,因为无法实现多个 - 我不确定这是否是让我绊倒的原因up 或者让我绊倒的是我已经离开 Rails 太多个月了。

根据 Rails 指南,当您在模型上声明 belongs_to 时,将向该模型的每个实例添加四个方法。在 Guide 示例中,在 Order 表中添加 belongs_to :customer 会添加:customer、customer=、build_customer 和 create_customer。

我在检查中没有看到这一点。我做错了什么或错过了一步吗?

我的两张表是这样的:

class Zzaddress < ActiveRecord::Base
   set_table_name 'zzaddress'
   has_many :zzpersons, :class_name => 'Zzperson'
end

class Zzperson < ActiveRecord::Base
   set_table_name 'zzperson'
   belongs_to :zzaddress, :class_name => 'Zzaddress', :foreign_key => "zzaddress_id"
end

现在,如果我检索这样的地址:

myaddr = Zzaddress.where( :id => 972 )

我得到了预期的结果。

当我尝试访问分配给该地址的任何人时,如下所示:

myaddr.zzpersons

我得到了心爱的人

NoMethodError: undefined method `zzpersons' for #<ActiveRecord::Relation:0x103c015d0>

果然,如果我查看模型的方法,它也不存在:

myaddr.methods.sort

提出了很多方法,但在 zz 范围内没有什么;-)

如果我在没有关联的情况下这样做,它会按您的预期工作:

grp = Zzperson.where( :zzaddress_id => 972 )

=> [#<Zzperson id: 1347, ....>, #<Zzperson id: 1349, ...>, #<Zzperson id: 1968, ...>]

从很久以前学到的一个教训是在编辑模型文件之间退出 rails 控制台,我继续坚持这一点。有没有办法从控制台中检查模型定义?我还记得重装!命令,但我可能会认为这并不总是有效?

这是 rails 3.2.11(全新安装,所以一切都应该是最新的),3.2.11 的 activerecord 也是如此。对于它的价值,PostgreSQL gem 是 pg (0.14.1)。 PostgreSQL 的版本是 9.1.4。

为了完整起见,schema.rb 是由 rake:schema:dump 创建的,它看起来对我有效:

create_table "zzaddress", :id => false, :force => true do |t|
   t.integer "id", :null => false
   <snip>
end

create_table "zzperson", :id => false, :force => true do |t|
   t.integer "id", :null => false
   t.integer "zzaddress_id", :default => 0, :null => false
   <snip>
end

pg_dump 创建的 SQL 语句文件显示了按预期创建的表:

CREATE TABLE zzaddress (
   id integer NOT NULL,
   etc.
);

CREATE TABLE zzperson (
   id integer NOT NULL,
   zzaddress_id integer DEFAULT 0 NOT NULL,
   etc.
);

【问题讨论】:

  • 在尝试了下面 Scott 的建议之后,我正在玩这个,我对此感到非常困惑,因为在我看来,我能够告诉 erb 以正常方式显示字段,但是在我在任何领域得到的控制台,更不用说 AR 关系,都是“缺少方法”

标签: postgresql activerecord ruby-on-rails-3.2


【解决方案1】:

如果我没记错的话,我相信 set_table_name 已被弃用。试试

self.table_name = 'zzaddress'

self.table_name = 'zzperson'

【讨论】:

  • 谢谢,斯科特。 TextMate 比我更好地为您的建议着色,但这是唯一的区别:)
【解决方案2】:

叹息。答案是我离开 Rails 太久了。

aperson = Zzperson.where(:id=>123)

返回一个集合!

aperson = Zzperson.where(:id=>123).first

返回一个人,这是我一直在寻找但一直忘记的。

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多