2017-01-27 8 views
2

Учитывая этого ActiveRecord определения таблицы:Как получить количество несохраненных связанных записей?

create_table :parents do |t| 
end 

create_table :children do |t| 
    t.references :parent 
end 

И соответствующие модели:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Когда я создаю несохраненную запись, которая имеет несохраненную ассоциацию:

parent = Parent.new 
parent.children << Child.new 

и попросить количество связанных записей:

parent.children.count 
=> 0 

Тогда результат равен 0. Я ожидал 1.

Я желаю графа я получаю, чтобы отразить как несохраненные и сохранены соответствующие записи. Как я могу получить этот счет?


Версии:

  • Rails 4.2.6
  • рубин 2.3.3
+1

@spickermann Хорошая находка. Я искал, прежде чем спрашивать, но не нашел этого. Этот вопрос указывает Rails 3.2. Я прошу Rails 4.2. У меня нет причин думать, что ответы будут разными для двух версий. Как вы думаете, мы должны изменить название другого вопроса, чтобы удалить номер версии, а затем отметить это как дубликат? –

+1

Я только что посмотрел документацию Rails 5.0, и поведение по-прежнему остается прежним. Поэтому: Да, я думаю, что это хорошая идея, чтобы отредактировать название других должностей и отметить это как дубликат. – spickermann

ответ

2

Вы должны использовать #size вместо #count. Когда вы (ну, я) обнаружили, #count игнорирует записи в памяти. #size рассматривает как сохраненные, так и несохраненные записи .

Вот методы, которые можно использовать для проверки наличия или подсчета связанных записей:

счета

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

размер

Чтобы получить общее количество сохраненных и несохраненных связанных записей, используйте size. Этот метод отличается от length тем, что он не заставляет связанные записи загружаться в память.

длина

Чтобы загрузить все связанные с ним записи в память, а затем рассчитывать все записи, использовать length. Будет возвращен общий счет как сохраненных, так и несохраненных записей.

есть?

Чтобы узнать, есть ли записи на диске, игнорируя наличие в памяти , используйте exists?. Это вызывает SQL-запрос каждый раз, игнорируя любое кэширование.

Ссылка

a github comment by Carlos Antonio Dasilva:

  • длина с всегда загружать объекты и использовать массив # длиной

  • счетчик всегда будет делать подсчет SQL

  • размера будет проверить, загружена ли коллекция, и использовать ее, в противном случае сделает счет.

размер должен дать вам правильное значение в этом случае, я думаю.

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

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