ActiveRecord关联方法未添加到模型中

时间:2013-01-13 08:25:12

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

我不得不围绕一个传统的PostgreSQL数据库构建一个rails应用程序,这个数据库不符合“Rails方式”,因为多数是不可能的 - 而且我不确定这是不是在绊倒我或者让我感到震惊的是,我已经离开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宝石是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.
);

2 个答案:

答案 0 :(得分:0)

如果我没弄错,我相信set_table_name已被弃用。试试

self.table_name = 'zzaddress'

self.table_name = 'zzperson'

答案 1 :(得分:0)

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

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

返回一个集合!

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

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