Rails3:如何将默认条件设置为has_many

时间:2010-07-12 08:11:22

标签: ruby-on-rails associations has-many finder-sql

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

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 个答案:

答案 0 :(得分:7)

您可以随时使用:

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

它适用于Rails3,但我不确定是否由于某些ActiveRecord :: Relation等效而不推荐使用此语法。在与Rails3相关的官方文档中,这种语法仍然可用,所以我猜这就像在2.3.x分支中一样。

答案 1 :(得分: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)

Credit and more information

答案 2 :(得分: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_valuesjoin_valuesorder_values等。

答案 3 :(得分:-1)

default_scope :color, :conditions => { :color => "green"}

使用此