我有盒子和球。球在盒子里。球可以是红色和绿色。
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
答案 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)
答案 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_values
,join_values
,order_values
等。
答案 3 :(得分:-1)
default_scope :color, :conditions => { :color => "green"}
使用此