我想到如果我有一个has_many连接,其中外部模型没有belongs_to,因此连接是一种方式,那么我实际上并不需要外键。
我们可以有一个列category_ids,它存储一个已编组的ID数组,我们可以将其传递给find
。
所以这是一个未经测试的例子:
class page < AR
def categories
Category.find(self.category_ids)
end
def categories<<(category)
# get id and append to category_ids
save!
end
def category_ids
@cat_ids ||= Marshal.load(read_attribute(:category_ids)) rescue []
end
def category_ids=(ids)
@cat_ids = ids
write_attribute(:category_ids, ids)
end
end
page.category_ids =&gt; [1,4,12,3] page.categories =&gt;类别数组
是否已经接受了这种模式?是常见还是不值得努力?
答案 0 :(得分:1)
当您进行编组/解组时,性能不会受到影响吗?
我个人认为这不值得付出努力,而你想要做的事情似乎并不清楚。
实际上这看起来像是多对多映射而不是多对一映射,因为没有代码可以阻止某个类别属于多个页面,当然你需要这样的东西:
create table categories_pages (
category_id integer not null references categories(id),
page_id integer not null references pages(id),
primary_key(category_id, page_id)
);
使用has和属于许多双方或has_many:通过双方(取决于您是否要存储更多东西)。
答案 1 :(得分:1)
我同意奥马尔的看法,这似乎不值得付出努力。
您的数据库不再反映您的数据模型,也不会在强制执行此关系方面提供任何帮助。此外,如果要将关系限制为has_many,则现在必须使编组的id数组与Category表保持同步,并强制跨Pages的唯一性。
但我猜最重要的是,这种方法有什么好处?它会增加复杂性并增加您必须编写的代码量。