将has_many和belongs_to映射到Active记录关系对象

时间:2011-09-02 15:01:39

标签: ruby-on-rails ruby

我有以下模特:

Model A < ActiveRecord::Base
  has_many :bs
end

Model B < ActiveRecord::Base
  belongs_to :c, , :polymorphic => true, :foreign_type => 'c_type', :foreign_key => 'c_id'
end

我想以c对象的形式获取与给定a对应的所有ActiveRecord::Relation

基本上我想删除以下方法

a.bs.each do |b|
  cs << b.c
end

因为这将输出c的数组,但我希望能够获得c的集合,我可以在其上运行范围,如:

cs.scoped(:order => :updated_at).all(:limit => 5)

我想我错过了一些简单的概念,比如映射可能是:

a.bs.map(&:to_resource) 

或类似的东西。

我正在运行rails 2.3.14。真的很感谢这方面的帮助。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用named_scope

执行此操作
class C < ActiveRecord::Base
  named_scope :by_a, lambda { |a| {:conditions => { :a_id => a.id }}
end

编辑:

我重读了你的问题,我想我第一次想念你了。总结一下你的模型看起来像这样:

class A < ActiveRecord::Base
  has_many :bs
end

class B < ActiveRecord::Base
  belongs_to :a
  belongs_to :c
end

class C < ActiveRecord::Base
  has_many :bs
end

你想要获得与B给定A相关的所有C,我是对的吗?在这种情况下,您需要的是A模型中的has_many :cs, :through => :b。所以你的A模型看起来像这样:

class A < ActiveRecord::Base
  has_many :bs
  has_many :cs, :through => :b
end

编辑2:

即使您无法修改包含模块中代码的文件,也可以向模型A添加许多内容。你可以这样做:

首先制作一个初始化器(在config / initializers中),如下所示:

require File.dirname(__FILE__) + '/../../lib/your_module.rb'
A.send( :include, YourModule)

然后在lib文件夹中创建一个这样的模块:

module YourModule

  def self.included(recipient)
    recipient.extend(ClassMethods)
  end
  module ClassMethods
    has_many :cs, :through => :b
  end
end

它应该有用。

答案 1 :(得分:0)

好的,考虑一下并再次阅读我觉得你要找的是has_many:通过联想。

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

Model A < ActiveRecord::Base
has_many :bs
has_many :cs, :through => :bs
end

Model B < ActiveRecord::Base
belongs_to :a
belongs_to :c, , :polymorphic => true, :foreign_type => 'c_type', :foreign_key => 'c_id'
end
然后可以直接访问

a.cs

旧答案:不确定您要做什么,但cs.sort_by(&:updated_at)怎么办?)