我有两个模型:CreditCard和BlacklistItem :: CreditCard。如果我首先搜索BlacklistItem :: CreditCard,我会得到预期的行为:
>> BlacklistItem::CreditCard.find(:all).first
=> #<BlacklistItem::CreditCard id: 5, *snip* >
>>
如果我先搜索一个CreditCard,当我去寻找BlacklistItem :: CreditCard项目后,我会出现意外行为:
>> CreditCard.find(:all).first
=> #<CreditCard id: 2, key_id: 4, *snip* >
>> BlacklistItem::CreditCard.find(:all).first
(irb):2: warning: toplevel constant CreditCard referenced by BlacklistItem::CreditCard
=> #<CreditCard id: 2, key_id: 4, *snip* >
>>
我做错了什么?只是不可能在他们之间拥有这种关系的名字吗?我将重命名BlacklistItem :: CreditCard作为解决方法,但它确实是这个特定对象的最佳名称。
答案 0 :(得分:7)
Rails中的命名空间模型已经有很长一段时间了。关于这个问题有一个很好的写作here。您可以尝试通过以下方式明确指定要用于模型中列入黑名单的信用卡的表名:
class BlacklistItem::CreditCard
set_table_name :blacklist_item_credit_card
...
end
然而,即便如此,拥有顶级CreditCard模型和命名空间的BlacklistItem :: CreditCard,由于Rails的自动行为,您仍可能遇到问题。