Estou tentando entender inverse_of
e não entendo.
Como é o sql gerado, se houver?
Será que a inverse_of
opção de apresentar o mesmo comportamento se usado com :has_many
, :belongs_to
e :has_many_and_belongs_to
?
Desculpe se esta é uma pergunta tão básica.
Eu vi este exemplo:
class Player < ActiveRecord::Base
has_many :cards, :inverse_of => :player
end
class Card < ActiveRecord::Base
belongs_to :player, :inverse_of => :cards
end
ruby-on-rails
activerecord
Federico
fonte
fonte
Eu acho que
:inverse_of
é mais útil quando você está trabalhando com associações que ainda não foram persistidas. Por exemplo:Agora, no console:
Sem os
:inverse_of
argumentos,t.project
retornarianil
, porque aciona uma consulta sql e os dados ainda não estão armazenados. Com os:inverse_of
argumentos, os dados são recuperados da memória.fonte
:inverse_of
resolveu um problema para mim ao criar novas entidades pai e filho da mesma forma.Após este procedimento ( https://github.com/rails/rails/pull/9522 ), inverse_of não é necessário na maioria dos casos.
O Active Record suporta identificação automática para a maioria das associações com nomes padrão. No entanto, o Active Record não identifica automaticamente associações bidirecionais que contêm um escopo ou qualquer uma das seguintes opções:
No exemplo acima, uma referência ao mesmo objecto é armazenado na variável
a
e no atributowriter
.fonte
inverse_of
ou não, o resultadoa.first_name == b.author.first_name
é sempre ture.Apenas uma atualização para todos - usamos apenas
inverse_of
um de nossos aplicativos com umahas_many :through
associaçãoBasicamente, torna o objeto "origem" disponível para o objeto "filho"
Então, se você estiver usando o exemplo do Rails:
O uso
:inverse_of
permitirá acessar o objeto de dados do qual é inverso, sem executar nenhuma consulta SQL adicionalfonte
Quando temos dois modelos com relacionamento has_many e pertence_ a, é sempre melhor usar o inverso_ que informa o ActiveRecod que eles pertencem ao mesmo lado da associação. Portanto, se uma consulta de um lado for acionada, ela será armazenada em cache e servida a partir do cache se for acionada na direção oposta. O que melhora o desempenho. No Rails 4.1, inverse_of será definido automaticamente, se usarmos Foreign_key ou alterações no nome da classe, precisaremos definir explicitamente.
Melhor artigo para detalhes e exemplo.
http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations
fonte
Dê uma olhada neste artigo!!
http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html
fonte
Se você possui uma
has_many_through
relação entre dois modelos, Usuário e Função, e deseja validar a Atribuição do modelo de conexão com entradas inexistentes ou inválidasvalidates_presence of :user_id, :role_id
, é útil. Você ainda pode gerar um usuário @ user com sua associação,@user.role(params[:role_id])
para que o salvamento do usuário não resulte em uma falha na validação do modelo de atribuição.fonte
Por favor, dê uma olhada 2 dois recursos úteis
E lembre-se de algumas limitações de
inverse_of
:fonte