Skip to content

Instantly share code, notes, and snippets.

@vsyrovat
Created April 18, 2018 16:37
Show Gist options
  • Save vsyrovat/d54b63980c966f0bfe89b67e212886d3 to your computer and use it in GitHub Desktop.
Save vsyrovat/d54b63980c966f0bfe89b67e212886d3 to your computer and use it in GitHub Desktop.
rails new demo && cd demo
rails g scaffold parent name:string age:integer
rails g scaffold toy parent_id:integer
""" прописываем belongs_to и has_many в моделях """
rake db:migrate
""" наполняем данными через веб-морду """
rails c
1. Parent.where(name: 'John').all или Parent.where(name: 'John') или Parent.where(name: 'John').find_each
2. Parent.where(age: 35)
3. Parent.where("age >= ?", 35)
4. Parent.where("created_at < ?", Date.new(2018,1,1))
5. Toy.where(parent_id: 4)
6. Toy.where(parent: Parent.where(name: 'Bob'))
7. Toy.where(parent: Parent.where('age <= ?', 35))
8. Parent.order(:name)
9. Parent.find_by_age(16)
10. Toy.where(parent: nil)
11. Parent.includes(:toys).where(toys: {id: nil})
12. Тут я не понял. Удалить все игрушки, которые сами старше 18 или родителям которых больше 18 лет? Наверное, второе.
Toy.where(parent: Parent.where('age > ?', 18)).destroy_all
13. В зависимости от того, выбирать ли родителей без игрушек. Если выбирать, то смотря как их сортировать.
Parent.all.sort_by {|parent| parent.toys.order(:name).take[:name] }
либо
Parent.all.each{|p| p.toys }.select{|parent| parent.toys.count > 0 }.sort_by {|parent| parent.toys.order(:name).take[:name] }
Но эффективнее всего конечно же одним запросом
Parent.find_by_sql(
"select parents.*
from parents
join toys on (toys.parent_id=parents.id)
group by toys.parent_id
order by min(toys.name)"
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment