`

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,也就没办法手工做查询了。
分享到:
评论
8 楼 yehs220 2007-07-20  
AllenYoung 写道
yehs220 写道
has_many :articles, :finder_sql=>...

麻烦你来告诉我finder_sql里面怎么写?

...articles.system_category_id=... OR articles.user_category_id=...
7 楼 iamawalrus 2007-07-20  
给categories加一个type的column,就可以使用rails提供的polymorphic功能。
详见belong_to中对:polymorphic的解释。
也可以参考acts_as_taggable的实现。
6 楼 AllenYoung 2007-07-20  
hideto 写道
感觉数据库这样设计很别扭,给category加一个flag用来区分system_cate和user_cate会清晰很多

这样需要一个多对多的关系,我不想用,因为代码里面比较麻烦。
5 楼 AllenYoung 2007-07-20  
cvu 写道
像这种外键不是缺省的modelname_id的,要用has_many :foreign_key的吧。

但是你的例子就算用has_many :foreign_key也不知道foreign_key是哪个。按照Rails的mapping规则,这应该是以个多对多(实际上是二对多,不管,也是多对多)。

三个表categories、articles、articles_categories,其中categories有一个属性category_type = [USER|SYSTEM];articles没有xxxx_category_id字段;articles_categories包括两个字段article_id和category_id。

然后,model Category:
  has_many :articles, :through => :article_categories
model Article:
  has_one :system_category, :through => :article_categories, :condition => "category_type = 'SYSTEM'"
  has_one :user_category, :through => :article_categories, :condition => "category_type = 'USER'"

以上伪代码,没有调试过。

这个好像挺有意思,我去试试看。
4 楼 AllenYoung 2007-07-20  
yehs220 写道
has_many :articles, :finder_sql=>...

麻烦你来告诉我finder_sql里面怎么写?
3 楼 hideto 2007-07-19  
感觉数据库这样设计很别扭,给category加一个flag用来区分system_cate和user_cate会清晰很多
2 楼 cvu 2007-07-19  
像这种外键不是缺省的modelname_id的,要用has_many :foreign_key的吧。

但是你的例子就算用has_many :foreign_key也不知道foreign_key是哪个。按照Rails的mapping规则,这应该是以个多对多(实际上是二对多,不管,也是多对多)。

三个表categories、articles、articles_categories,其中categories有一个属性category_type = [USER|SYSTEM];articles没有xxxx_category_id字段;articles_categories包括两个字段article_id和category_id。

然后,model Category:
  has_many :articles, :through => :article_categories
model Article:
  has_one :system_category, :through => :article_categories, :condition => "category_type = 'SYSTEM'"
  has_one :user_category, :through => :article_categories, :condition => "category_type = 'USER'"

以上伪代码,没有调试过。
1 楼 yehs220 2007-07-19  
has_many :articles, :finder_sql=>...

相关推荐

    Ruby on Rails中的ActiveRecord编程指南

    避免改动缺省的 ActiveRecord(表的名字、主键,等等),除非你有一个非常好的理由(像是不受你控制的数据库)。  把宏风格的方法放在类别定义的前面(has_many, validates, 等等)。  偏好 has_many :through 胜...

    fixture_dependencies:SequelActiveRecord夹具加载器,用于处理依赖关系图

    支持many_to_one / belongs_to,one_to_many / has_many,many_to_many / has_and_belongs_to_many和has_one / one_to_one关联 以不违反外键约束的方式加载灯具的依赖关系图 有一个非常简单的API...

    has_array_of:PostgreSQL数组上的ActiveRecord关联

    该插件使用PostgreSQL数组的功能实现了在Rails中进行has_and_belongs_to_many关联的替代方法。 在很多情况下,你只需要或的功能使用许多一对多与连接表是不必要的传统方法。 我们可以只存储id的整数数组。 它是如何...

    ruby声明式语法的实现例子

    has_many和belongs_to其实是Topic类的class method,标准写法是: 代码如下: class Topic &lt; ActiveRecord::Base  Topic.has_many(:posts)  Topic.belongs_to(:user) end 那么has_many可以给我们带来什么呢?...

    association_callbacks:ActiveRecord关联的回调

    提供一种将一个模型的定义为关联模型的方法。 例子 首先,两个简单的Article和Comment模型: class Article &lt; ActiveRecord :: Base has_many :comments end class Comment &lt; ActiveRecord :: Base belongs...

    amoeba:Ruby宝石,允许复制ActiveRecord对象及其关联的子对象,可通过模型上的DSL配置

    has_and_belongs_to_many 一个简单的DSL,用于配置要复制的字段。 DSL可以应用于您的Rails模型或即时使用。 支持STI(单表继承)子代继承其父变形虫设置。 多种配置样式,例如包含,排除和不

    effective_datatables:对于Ruby on Rails,有效的ActiveRecord到Datatables dsl。 快速制作智能表

    强大的服务器端搜索,排序和筛选ActiveRecord类(具有belongs_to和has_many关系)。 通过搜索sql列以及ActiveRecord和Array集合中的计算值来做正确的事情。 显示基于current_user授权操作的关联编辑/显示/销毁...

    显示关联轨道NYC04-SENG-FT-053120

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。博客类别在本课程中,我们将设置一个...

    query_methods_extend

    查询方法扩展 在 rails 4 扩展查询 activerecord 安装 将此行添加到应用程序的 Gemfile 中: ... belongs_to :store has_many :books end // Category ( id : integer , name : string , store_id : integer ) cla

    显示关联Rails休斯敦网站111918

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。博客类别在本课程中,我们将设置一个...

    MangoDB:MongoDB KO 3.3(用于3.2、3.1和3.0检查分支)

    to,has_many和has_and_belongs_to_many 验证对象数据,包括嵌入式对象类表扩展的行为-例如Model_Ferrari扩展Model_Car扩展芒果。 其他ORM用户非常熟悉的非常简单的语法芒果数据库一个访问MongoDB的简单包装器。 将...

    显示关联轨道网络012918

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。 博客类别 在本课程中,我们将设置...

    actions_as_inheritable:ActiveRecord模型的可继承功能

    ActsAsInheritable 充当可继承对象是专门为Rails / ActiveRecord... ActiveRecord :: Base belongs_to :parent , class : Person has_many :children , class : Person , foreign_key : :parent_id has_many :grandc

    显示关联Rails-Chicago-Web-021720

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。博客类别在本课程中,我们将设置一个...

    显示关联rails-houston-web-012720

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。博客类别在本课程中,我们将设置一个...

    显示关联导轨wdc01-seng-ft-060120

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。博客类别在本课程中,我们将设置一个...

    显示关联rails-v-000

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。 博客类别 在本课程中,我们将设置...

    显示关联轨道伦敦网络职业生涯040119

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。 博客类别 在本课程中,我们将设置...

    显示关联rails-dumbo-web-111819

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。 博客类别 在本课程中,我们将设置...

    显示关联rails-denver-web-033020

    创建has_many和belongs_to关联。 通过控制台和db/seeds.rb构建关联的数据。 使用关联提供的方法查询关联数据。 将关联数据嵌入视图中。 遍历显示单个实例的视图内的关联数据。 博客类别 在本课程中,我们将设置...

Global site tag (gtag.js) - Google Analytics