我不得不围绕一个传统的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.
);
答案 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
返回一个人,这是我一直在寻找的但却一直忘记。