@pillar = Pillar.where(id: @blog.pillars_id)
возвращает ActiveRecord::Relation
, а не Pillar
. Вы можете попробовать:
@pillar = Pillar.where(id: @blog.pillars_id).first
или
@pillar = Pillar.find_by(id: @blog.pillars_id)
Вы также можете сделать:
@pillar = Pillar.find(@blog.pillars_id).
Но это приведет к ошибке, если не существует Pillar
с указанным id
.
(Вы уверены, что это pillars_id
, а не pillar_id
?)
Купить почему бы не сделать:
@pillar = @blog.pillar
в вашем контроллере - так как вы, вероятно, правильно настроили свои ассоциации. Тогда вы можете использовать @pillar.name
на ваш взгляд.
Или, по вашему мнению, вы можете сделать:
@blog.pillar.name
Мне не особо нравится @blog.pillar.name
в представлении (потому что ваше представление должно знать много о Blog
и Pillar
). Даже использование @pillar.name
в вашем представлении означает, что ваше представление должно знать что-то о Pillar
(в частности, у него есть метод, называемый name
). Я думаю, что я бы предпочел сделать:
@pillar_name = @blog.pillar.name
в вашем контроллере и используйте @pillar_name
в вашем представлении. Тогда вашему взгляду не нужно ничего знать о Blog
или Pillar
.
В этом случае ваш контроллер знает немного о Blog
и Pillar
. Вы могли сделать
class Blog < ActiveRecord::Base
def pillar_name
pillar.name
end
end
Теперь в вашем контроллере вы можете сделать:
@pillar_name = @blog.pillar_name
В этом случае ваш контроллер знает что-то о Blog
, но ничего о Pillar
.
Но, Blog
еще должен знать о Pillar
. Итак, вы можете сделать:
class Blog < ActiveRecord::Base
delegate :piller_name, to: :pillar
end
и
class Pillar < ActiveRecord::Base
alias pillar_name name
end
так что Blog
очень мало знает о Pillar
.
Также, посмотрите комментарии для действительно хорошего предложения от @spike, что-то вроде:
class Blog < ActiveRecord::Base
delegate :name, to: :pillar, prefix: true
end
Затем вы можете игнорировать изменения Pillar
.