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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top