Rails3: как установить условия по умолчанию для has_many - PullRequest
3 голосов
/ 12 июля 2010

У меня есть коробки и шары.Шарики в коробках.Мяч может быть как красным, так и зеленым.

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 ]

7 голосов
/ 01 сентября 2010

Вы всегда можете использовать:

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

Это работает в Rails3, но я не уверен, что этот синтаксис не будет устаревшим из-за некоторого эквивалента ActiveRecord :: Relation.В официальной документации, связанной с Rails3, этот синтаксис все еще доступен, поэтому я думаю, что он остался таким же, как в ветке 2.3.x.

2 голосов
/ 12 июля 2010

А в 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)

Кредит и дополнительная информация

0 голосов
/ 16 января 2013

Это старый вопрос, но я просто хотел сделать то же самое, и натолкнулся на этот вопрос во время поиска. Я никогда не находил решения, но я нашел что-то, что хорошо работает.

Для вашего примера, вы можете сделать это:

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 и т. Д.

0 голосов
/ 12 июля 2010
default_scope :color, :conditions => { :color => "green"}

Используйте это

...