Carga antecipada não funciona no Rails 2.2.2
-
21-08-2019 - |
Pergunta
Eu estou trabalhando com modelos análogos ao seguinte:
class Owner < ActiveRecord::Base
has_many :owned
end
class Owned < ActiveRecord::Base
belongs_to :owner
end
Você pode presumir que owned_id e owner_id estão nos lugares certos. O problema é que, em um controlador para uma cadeia MVC diferente no aplicativo,
@owner = Owned.find_by_id(owned_id, :include => :owner)
não funciona. Tenho a owner_id, coluna, naturalmente, mas não pode, em seguida, fazer
@owned.owner # is just nil
O que dá? Quer dizer, eu poderia fazer a atribuição diretamente antes de passar o resultado para a vista:
@owned.owner = Owner.find_by_id(@owned.owner_id)
mas que apenas parece bobo. Vamos lá, me envergonhar. Qual é a coisa óbvia que eu perdi? Isso funciona em outros lugares em meu aplicativo, mas eu não posso detectar as diferenças. Existem algumas armadilhas comuns? Qualquer coisa ajuda.
Obrigado
Solução
Eu apenas continuar vencendo. O objeto 'Owner' correspondente tinha sido excluída da tabela proprietários.
O engraçado é que, antes de eu criei uma conta, eu tinha toneladas de karma na minha identidade baseada em cookie. Então meus cookies se corrompeu, e eu não posso pedir nada, mas perguntas estúpidas mais, e meu karma fica em 1. Oh bem.
Outras dicas
Reputação em StackOverflow não está baseadas em cookies. Você pode ter que logar novamente ou algo assim.
Sua pergunta parece implicar que você tem um campo owned_id na tabela de proprietário. Você não precisa disso e deve removê-lo.
Você só precisa de um campo inteiro owner_id na tabela de propriedade.
Você pode acessar seus registros e relacionamentos em um número de maneiras. Primeiro vamos começar acessando o registro primeiro proprietário.
owner = Owner.find(owner_id)
owned = owner.owned # this is an array since you a 'has_many' relationship
Normalmente, você gostaria de acessar os registros de propriedade da seguinte maneira:
for owned in owner.owned
puts owned.name # or access any other attributes
end
Se você gostaria de acessar os registros pertencentes primeiro você poderia fazer o seguinte:
@owned = Owned.find(:all, :conditions => [ "owner_id = ?", owner_id ])
# @owned is an array so you need to iterate through it
for owned in @owned
puts owned.owner.name # or access any other attribute from the owner
end
Uma vez que você tem essas consultas bem você pode se preocupar com o carregamento ansioso pela adição de trabalho: incluir em suas declarações encontrar. Note-se que esta pode ser de interesse para a otimização mas não é necessário desde o ir buscar.
Espero que isso ajude.