Получение «имени» вместо значения имени из базы данных rails - PullRequest
0 голосов
/ 04 июля 2018

В моем приложении есть структура, где каждая запись blog связана с pillar. На моем blogs#show у меня есть следующее определение:

@pillar = Pillar.where(id: @blog.pillars_id)

Тем не менее, когда я захожу на страницу блога и пытаюсь получить доступ к @pillar.name, я получаю «Столб» вместо названия столба (например, «Общая информация» или «Финансирование покупки дома»). Когда я отлаживаю и запрашиваю страницу ошибки для @pillar, она отображает следующее:

<ActiveRecord::Relation [#<Pillar id: 2, name: "Financing Your Home Purchase", buyer: true, seller: false, active: true, menu: false, snippet: "Another test snippet.  Should I be thinking wittil...", description: "It is our choices Harry that show what we truly ar...", created_at: "2018-07-03 16:50:55", updated_at: "2018-07-03 16:50:55">]>

Если это поможет, a blog belongs_to a pillar и pillar has_many blogs.

Кто-нибудь может понять, что здесь происходит?

1 Ответ

0 голосов
/ 04 июля 2018
@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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...