2010-11-14 1 views
19
  1. Методы ассоциации Do, такие, как те, которые определены has_many и belongs_to использовать ActiveRecord::Relation?Можно ли получить объект ActiveRecord :: связь для ассоциации

  2. Если да, возможно ли получить объект ActiveRecord::Relation, который используется.

Мы все знаем, что Rails 3 сильно используя ActiveRecord::Relation объекты и Arel::Relation объектов в фоновом режиме, при создании запросов с использованием Query Interface. Всякий раз, когда мы используем методы интерфейса select, joins и т. Д., Возвращается объект ActiveRecord::Relation. Однако это не похоже на вызов метода ассоциации модели. Вместо этого запрос выполняется немедленно, и возвращается экземпляр или массив экземпляров связанной модели.

Рассмотрим следующие модели:

post.rb

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

user.rb

class user < ActiveRecord::Base 
    has_many :posts 
end 

Пример:

u = User.first 
u.posts 

Вызов u.posts возвращает массив сообщений, а не экземпляр ActiveRecord::Relation. Мне интересно, можно ли получить ActiveRecord::Relation, то есть , используемый ассоциацией, если он вообще используется, возможно, используя Arel::Table?

Мои рассуждения о желании ActiveRecord::Relation должны быть очевидны: это потому, что я хочу связать существующую связь и манипулировать запросом в соответствии с другой целью.

ответ

32

В течение нескольких минут я использовал where(nil) хак, то у меня было озарение, и пытался что-то случайное:

User.first.posts.scoped 

Вот так! : D

Да, Rails + Arel действительно плохо документирован. С нетерпением ждем его созревания до такой степени, что я действительно смогу посмотреть на вещи и получить ответы на реальные вопросы.

+0

Люблю это. Гораздо чище! Я даю вам CHECKMARK. И я соглашаюсь с документацией Arel. Я читал обрывки и кусочки повсюду об этом. Это кажется очень мощным, но без хорошей документации, это может быть довольно раздражающим. :) – John

+0

Блестящий, спасибо большое! –

+0

есть способ вызвать '.scoped' на пользовательский массив, который я создал? – brittohalloran

1

Пользуясь временем, чтобы ознакомиться с документацией по граничным руководствам, я смог найти a ответ в Section 4.3 has_many Association Reference. Короче говоря, документация не проливает свет на то, можно ли получить объект ActiveRecord::Relation или использовать объект ActiveRecord::Relation, но он содержит подробную информацию о том, как повторно использовать связь и адаптировать ее результат.

Раздел 4.3.1 Methods Added by has_many перечисляет collection.where как один из методов, которые добавляют в has_many ассоциации. И в разделе 4.3.1.11 collection.where(…) показано, что вы будете использовать его так же, как и пользовательский метод интерфейса запроса where. Что еще более важно, он дает подсказку, что объекты лениво загружаются при использовании этого метода в коллекции, и, конечно же, возвращается объект ActiveRecord::Relation.

u.posts.where("").class # => ActiveRecord::Relation 
u.posts.where("").to_sql # => SELECT `posts`.* FROM `posts` WHERE `posts`.user_id = 1 

По общему признанию, это не идеальное решение, но оно дает мне то, от чего я могу соединиться.

3

в Rails 4, используйте .scope или .spawn для доступа к объекту отношения, а не к CollectionProxy. См. documentation.

1

В ActiveSupport::Concern вы не можете позвонить по частному методу spawn или использовать scope или scoped.

Мне нужно было использовать это.

where(true) 

 Смежные вопросы

  • Нет связанных вопросов^_^