3

我有盒子和球。球在盒子里。球可以是红色和绿色。

class Box < ActiveRecord::Base
  has_many :balls
end

class Ball < ActiveRecord::Base
  belongs_to :box
  scope :green, where(:color => "green")
end

我只想用绿球设置 has_many 。我知道 finder_sql 方法存在,但我不知道如何通过范围进行设置。

我希望以下示例是等效的:

@orders = @box.balls
@orders = @box.balls.green
4

4 回答 4

7

您可以随时使用:

has_many :balls, :conditions => { :color => "green" }

它在 Rails3 中工作,但我不确定是否由于某些 ActiveRecord::Relation 等价物而不会弃用此语法。在与 Rails3 相关的官方文档中,这个语法仍然可用,所以我猜这就像在 2.3.x 分支中一样。

于 2010-09-01T13:03:45.913 回答
2

在 Rails 3 中,它略有变化:

class Item
  scope :red, where(:colour => 'red')
  scope :since, lambda {|time| where("created_at > ?", time) }
end

red_items = Item.red
available_red_items = red_items.where("quantity > ?", 0)
old_red_items = Item.red.since(10.days.ago)

信用和更多信息

于 2010-07-12T13:06:37.350 回答
0

这是一个老问题,但我只是想做同样的事情,我在搜索时遇到了这个问题。我从来没有找到解决方案,但我想出了一些行之有效的方法。

对于您的示例,您可以这样做:

class Box < ActiveRecord::Base
  has_many :balls do
    def self.extended(base)
      base.where_values += Ball.green.where_values
    end
  end
end

class Ball < ActiveRecord::Base
  belongs_to :box
  scope :green, where(:color => "green")
end

我不知道这样做的含义,但经过一些初步测试,它似乎没有问题。还有其他可以设置的值,例如eager_load_values, join_values,order_values等。

于 2013-01-16T03:53:38.940 回答
-1
default_scope :color, :conditions => { :color => "green"}

用这个

于 2010-07-12T09:56:56.097 回答