单向has_many加入的模式?

时间:2009-06-02 16:04:59

标签: ruby-on-rails activerecord has-many

我想到如果我有一个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;类别数组

是否已经接受了这种模式?是常见还是不值得努力?

2 个答案:

答案 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的唯一性。

但我猜最重要的是,这种方法有什么好处?它会增加复杂性并增加您必须编写的代码量。