ActiveRecord中表关联的一个问题,belongs_to和has_many不是一一对应的情况。

阅读更多
一个挺有意思的问题,想了半天没有解决办法。

情景是这样的:系统中有两种category,system_category和user_category,所有属性都一样,只是一个是系统分类,一个是用户自己的分类。比如javaeye就是有这样的机制。用户发文时可以同时选择system_category和user_category。假如数据库的设计是system_category和user_category都在一张表categories中。那么Category和Article类的代码大致如下:
# Category.rb
class Category < ActiveRecord::Base
  has_many :articles
end

# Article.rb
class Article < ActiveRecord::Base
  belongs_to  :system_category, :class_name   => "Category", :foreign_key => "system_category_id"
  belongs_to  :user_category,   :class_name   => "Category", :foreign_key => "user_category_id"
end

各位肯定已经注意到了,两边的has_many和belongs_to不是一一对应的。这个时候执行一些语句,结果如下(假设id为1的user cateogry有两个article,id分别为1,2):
Article.find_by_id(1).user_category.id  # => 1
Article.find_by_id(2).user_category.id  # => 1
Category.find_by_id(1).articles            # 出错,说articles没有category_id。

出现以上错误是正常的,但是有什么方法可以解决这个问题吗?当然,我可以在category中声明两个has_many,但是这样显然不符合应用逻辑。我也尝试过使用:finder_sql,但是不知道怎么得到当前category的id,也就没办法手工做查询了。

你可能感兴趣的:(ActiveRecord,Rails,Ruby,SQL)