我的PG DB表格中存在此问题。我有一张桌子,名字叫“hproducts_rules”。这应该与“hproducts_matchs”表具有“belongs_to”关系。
这是我的表架构:
hproducts_match
has_many :productsrule
default_scope order: 'id'
attr_accessible :productsrule_attributes, :product_id, :company_id, :product_key, :description, :condition
accepts_nested_attributes_for :productsrule, :reject_if => :all_blank, :allow_destroy => true
self.table_name = "hproducts_matchs"
hproducts_rule
belongs_to :productsmatch
default_scope order: 'id'
attr_accessible :productsmatch_id, :company_id, :product_key, :origen_comp, :line, :connector, :char_start, :char_end, :modeprize_id, code_opc, :ochar_start, :onchar_end self.table_name = "hproducts_rules"
当我尝试在“products_match”表单中添加部分内容时,出现以下错误:
PG::UndefinedTable: ERROR: relation «productsrules» does not exists
LINE 5: WHERE a.attrelid = '"productsrules"'::regclas...
^
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"productsrules"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
我首先想到的是因为我的表名是“hproducts_match”而我的“products_chles”表上的参考字段是“productsmatch_id”,所以我将名称更改为“hproductsmatch_id”并得到了相同的结果。然后我将整个表名更改为“products_rules”而不是“hproducts_rules”,并且仍然相同。我甚至在表和模型上添加了foreign_key约束,但仍然是相同的。
我不确定该关系是否应该被命名为“hproductsrules”或“productsrules”,所以这可能就是问题所在。我在哪里可以改变它?
我做了一些研究,其中大部分与移民有关。我没有在我的数据库开发中使用迁移,我手动添加了表,就像我已经完成了每一个。其他人关于rspec,超出了我的范围。
任何人都知道为什么会这样?这只会在我使用表单中的partial时显示。
提前致谢。
编辑显示我的答案
好吧,由于一些明显的原因我的应用程序假设我的表名是“productsrules”而不是“hproducts_rules”所以我所做的是将“self.table_name”行更改为我的模型的顶部然后一切都正常
不确定这是否是这个问题的正确答案,但它帮助我解决了这个问题。
我将我的模型恢复到原始状态(我在这个问题的开头有一个),唯一的区别如下:
class Productsrule < ActiveRecord::Base
self.table_name = "hproducts_rules"
belongs_to :productsmatch
default_scope order: 'id'
attr_accessible :productsmatch_id, :company_id, :product_key, :origen_comp, :line, :connector, :char_start, :char_end, :modeprize_id, code_opc, :ochar_start, :onchar_end
end
如您所见,self.table_name行位于模型的开头。
感谢所有回复的人:)
答案 0 :(得分:1)
如果不遵循关联的rails命名约定,则必须明确指定外键和类名。与您明确设置表名的方式类似
<强> hproducts_match 强>
has_many :products_rules, :foreign_key => "productsmatch_id", :class_name => "HproductsRule"
default_scope order: 'id'
attr_accessible :productsrule_attributes, :product_id, :company_id, :product_key, :description, :condition
accepts_nested_attributes_for :productsrule, :reject_if => :all_blank, :allow_destroy => true
self.table_name = "hproducts_matchs"
<强> hproducts_rule 强>
belongs_to :products_match, :foreign_key => "productsmatch_id", :class_name => "HproductsMatch"
default_scope order: 'id'
attr_accessible :productsmatch_id, :company_id, :product_key, :origen_comp, :line, :connector, :char_start, :char_end, :modeprize_id, code_opc, :ochar_start, :onchar_end self.table_name = "hproducts_rules"
答案 1 :(得分:1)
如果你像你一样编写关系,rails将尝试根据关系名称派生类名和表名。
所以,如果你写
has_many :productsrule
你真的写得很奇怪吗?这很奇怪nr 1.但是rails会查找表productsrules
和模型Productsrule
。
相反,如果你写:
has_many :hproducts_rules
它会查找模型HproductsRule
和表格hproducts_rules
。这似乎是你想要的。现在对于引用键,它将以[{1}}格式查找外键,因此在您的情况下将是<model-name>_id
,并且该字段也不存在。
因此,如果你想保持目前的情况,你可以写:
hproducts_match_id
但由于您似乎可以完全控制数据库模型,为什么不写:
class HproductsMatch
has_many :hproducts_rules, :foreign_key => 'productsmatch_id`
default_scope order: 'id'
attr_accessible :hproducts_rule_attributes, :product_id, :company_id, :product_key, :description, :condition
accepts_nested_attributes_for :hproduct_rules, :reject_if => :all_blank, :allow_destroy => true
self.table_name = "hproducts_matchs"
end
class HproductsRule
belongs_to :hproducts_match, :foreign_key => 'productsmatch_id'
default_scope order: 'id'
attr_accessible :productsmatch_id, :company_id, :product_key, :origen_comp, :line, :connector,
end
在这种情况下,您的表class ProductsMatch
has_many :products_rules
accepts_nested_attributes_for :products_rules
end
class ProductsRule
belongs_to :products_match
end
包含foreign_key products_rules
和表products_match_id
。