ActiveRecord Использование.where() в грязных (несохраненных) отношениях

Предположим, что у меня есть это соотношение

Модели /person.rb

class Person
 belongs_to :group
end

модели /group.rb

class Group
 has_many :people
end

Теперь я создаю человека и назначаю новую группу

group = Group.create(name: 'Group A')
group.person.new(name: 'John')
group.person.new(name: 'Lucy')
# Now if I call group.person.where(name: 'Lucy') 
# here it will return an empty result, 
# because it has not been persisted to the database.

Нужно ли включать в поиск несохраненные записи?

Моя причина для этого - мне нужно создать много людей для группы, и вам нужно выполнить запрос where() в середине, чтобы узнать, добавил ли я кого-то с этим именем. Я бы предпочел просто вызвать group.save после создания экземпляра всех людей, поскольку он выполняется в одной транзакции, а не отдельной транзакции для каждого человека, который намного медленнее.

1 ответ

Не сохранять записи в базу данных, where метод бесполезен. Единственное возможное решение, которое я вижу здесь, - манипуляция с Array.

Вы можете использовать метод select рубинового массива здесь

group.persons.new(name: 'John')
group.persons.new(name: 'Lucy')

group.persons.select{|x| x['name']=='Lucy'} # will return the record

См. Этот вопрос и документацию

licensed under cc by-sa 3.0 with attribution.