我有以下模特:
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。真的很感谢这方面的帮助。
提前致谢。
答案 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)
怎么办?)