ActiveRecord::Base.connection.tables.each do |table|
result = ActiveRecord::Base.connection.execute("SELECT id FROM #{table} ORDER BY id DESC LIMIT 1") rescue ( puts "Warning: not procesing table #{table}. Id is missing?" ; next )
ai_val = result.any? ? result.first['id'].to_i + 1 : 1
puts "Resetting auto increment ID for #{table} to #{ai_val}"
ActiveRecord::Base.connection.execute("ALTER SEQUENCE #{table}_id_seq RESTART WITH #{ai_val}")
end
Arquivo da tag: Rails5
Deploy Rails + Docker
Add nullable foreign key in Rails
Rails 5.2 credentials
Criando API REST com Rails 5
Change my default localhost port in Rails 5
Updating to Rails 5.0
Documentação – mongoid
Utilizando Concerns em Rails
O que é Concern?
Concern é um módulo utilitário do ActiveSupport, suportado pelas versões 3 e 4 do Rails e que permite e facilita o compartilhamento de código entre modelos. Além disso, é possível separar diversas responsabilidades de um Modelo, permitindo assim filtrar funções que são exclusivamente de um contexto do modelo em um Concern e importá-las.
Vamos exemplificar um caso onde temos um blog post e este post pode conter diversos votos (positivos ou negativos) e comentários. Os comentários também podem receber votos (positivos ou negativos).
A modelagem desse sistema ficaria basicamente dessa forma:
[code type=ruby]
# models/post.rb
class Post < ActiveRecord::Base validates :title, :content, presence: true has_many :votes has_many :comments end
[code type=ruby]
# models/comment.rb
class Comment < ActiveRecord::Base validates :content, presence: :true has_many :votes belongs_to :post end
[code type=ruby]
# models/vote.rb
class Vote < ActiveRecord::Base enum vote_type: [ :upvote, :downvote ] end
Neste exemplo fica claro que caso quisermos ter uma função que compute um voto para o comentário ou post, teríamos que criar uma função similar entre o modelo Post e o modelo Comment.
A partir dessa ideia, podemos criar um módulo chamado Votable que possui funções que serão executadas e compartilhadas pelos dois modelos.
[code type=ruby]
# models/concern/votable.rb
module Votable
extend ActiveSupport::Concern
included do
has_many :votes
end
def vote!
votes.create
end
def downvote!
votes.create(vote_type: :downvote)
end
def upvote!
votes.create(vote_type: :upvote)
end
end
Inserimos uma função genérica chamada vote!
e duas outras funções para caso o voto seja específico: upvote!
para votos positivos e downvote!
para negativos.
E agora? Como conseguimos incorporar o Concern que acabamos de criar para os diversos modelos utilizados?
Basta incluir include Votable
em cada modelo pretendido.
Por exemplo, para ser permitido o Post utilizar a função vote!
, ficaria assim:
[code type=ruby]
# models/post.rb
class Post < ActiveRecord::Base include Votable validates :title, :content, presence: true has_many :comments end # models/comment.rb class Comment < ActiveRecord::Base include Votable validates :content, presence: :true belongs_to :post end
Com isso, se entrarmos no console, já conseguimos reproduzir o caso de uso. É gerado um voto: Do mesmo modo funciona para o modelo Comment: Sucesso! Outro exemplo de utilização seria se não tivéssemos comentários, porém muitas funções relacionadas a voto no modelo Post. Nesse caso, poderíamos colocar essas também em um Concern e importá-las para o modelo. Utilizar a técnica de Concern pode trazer alguns malefícios. Por exemplo: Lembre-se que existem outros casos de uso para o Concern. Estude bem a técnica para identificar se é a melhor solução para o seu contexto, sempre levando em conta seus pontos negativos. Concern é um módulo muito interessante, principalmente para separar responsabilidades de classes complexas ou para compartilhar código entre modelos. Neste post explicamos como utilizar Concern, exemplificando este módulo que foi útil para o nosso projeto em determinado contexto e pode ser interessante para o seu projeto. Porém, é necessário usá-lo conscientemente e entender o porquê de estar sendo aplicado ao projeto, pois utilizá-lo de maneira errada adicionará mais complexidade ao projeto, dificultando o entendimento do sistema para pessoas que estão começando a mexer no projeto. Você tem alguma experiência interessante utilizando Concerns? Compartilhe nos comentários abaixo!
[code type=ruby]
irb(main):003:0> post = Post.create(title: “Concern”, content: “Post”)
=> #
irb(main):004:0> post.vote!
[code type=ruby]
irb(main):005:0> post.votes.last
=> #
[code type=ruby]
irb(main):007:0> comment = Comment.create(content: “Concern”, post_id: 1)
=> #
irb(main):008:0> comment.vote!
=> #Pontos negativos
Conclusão
Rails 5 – Trabalhando com CORS
[code type=ruby]
# Gemfile
gem ‘rack-cors’
[code type=ruby]
# config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, “Rack::Cors” do
allow do
origins ‘localhost:4200’
resource ‘*’,
headers: :any,
methods: %i(get post put patch delete options head)
end
end