has_many: через конкретные условия экземпляра - PullRequest
1 голос
/ 10 октября 2011

Можно ли установить ограничение уровня экземпляра для has_many: через отношение в рельсах 3.1?

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

Это дает мне "нераспознанный токен" # "на рельсах 3.1. Хотите знать, если эта функция больше не работает?

РЕДАКТИРОВАТЬ

Хочу уточнить, почему я не думаю, что сфера - это решение. Я хочу иметь возможность получить из экземпляра A все C, которые имеют условие (которое основано на атрибуте этого экземпляра A). Это единственные C, которые должны когда-либо ассоциироваться с этим A. Чтобы сделать это с областями действия, я бы поставил область видимости на C, которая принимает аргумент, а затем должен был бы вызвать его из @a с некоторым значением? Я не понимаю, почему это лучше, чем включить его в мой запрос has_many напрямую.

1 Ответ

2 голосов
/ 11 октября 2011

Используйте область на модели 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...