has_many:通过实例特定条件

时间:2011-10-10 17:45:24

标签: ruby-on-rails ruby-on-rails-3.1

是否可以在rails 3.1中的has_many,:through关系上设置实例级约束?

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

类似的东西:

Class A
    has_many :c, :through => :b, :conditions => { "'c'.something_id" => @a.something_id }

文档给了我这个希望,但它对我不起作用:

  

如果需要在运行时动态评估条件,则可以   在单引号中使用字符串插值:

class Customer < ActiveRecord::Base
  has_many :latest_orders, :class_name => "Order",
    :conditions => 'orders.created_at > #{10.hours.ago.to_s(:db).inspect}'
end

这让我在rails 3.1上获得了“无法识别的标记'#'”。想知道这个功能是否不再起作用了吗?

编辑

想澄清为什么我认为范围不是解决方案。我希望能够从具有条件的所有C的实例中获取(基于该实例的A的属性)。这些是唯一应该与A相关联的C。要使用范围执行此操作,我会在C上放置一个带有参数的范围,然后必须从@a调用它有一些值吗?我不明白为什么这比直接将它合并到我的has_many查询中更好。

1 个答案:

答案 0 :(得分:2)

orders型号上使用范围:

class Order < ActiveRecord::Base
  belongs_to :customer
  scope :latest, lambda { where('created_at > ?', 10.hours.ago) }
end

然后用:

来调用它
@customer.orders.latest

如果您真的想使用latest_orders,则可以将其添加到Customer模型中:

def latest_orders
  orders.where('created_at > ?', 10.hours.ago)
end