2013-01-13 53 views
0

我不得不圍繞舊式PostgreSQL數據庫構建Rails應用程序,該數據庫不符合「Rails方式」,因爲多個方法是不可能的 - 我是不知道這是什麼讓我絆倒或讓我絆倒是因爲我已經離開Rails太多個月了。ActiveRecord關聯方法不被添加到模型中

根據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, ...>] 

的教訓,從很久以前就學會在編輯之間退出軌控制檯的模型文件,這是我繼續堅持。有沒有辦法從控制檯內檢查模型定義?我也記得重新加載!命令,但可能會暗示自己並不總是工作?

這是軌3.2.11(全新安裝,所以一切應該是最新的),以及在3.2.11積極記錄等。對於它的價值,PostgreSQL寶石是pg(0.14.1)。 PostgreSQL的版本是9.1.4。

而且爲了完整起見,schema.rb被耙創建:模式:轉儲,它看起來有效的對我說:

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. 
); 
+0

經過下面Scott的建議,我在玩這個,我真的很困惑,因爲在我看來,我可以告訴erb以正常方式顯示字段,但是在控制檯中,米獲得任何領域,更少的AR關係,是「缺少方法」 – tobinjim

回答

0

嘆息。答案是我已經離開Rails太久了。

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

返回一個集合!

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

回報一個人,這正是我一直在尋找,但一直遺忘。

0

如果我沒有弄錯,我相信set_table_name已被棄用。嘗試

self.table_name = 'zzaddress' 

self.table_name = 'zzperson' 
+0

謝謝,斯科特。 TextMate使你的建議比我的顏色更好,但這是唯一的區別:) – tobinjim

相關問題