Rails Activerecord не возвращает значения

#ruby-on-rails #join #activerecord

#ruby-on-rails #Присоединиться #activerecord

Вопрос:

Вопрос Rails…

Я пытаюсь распечатать данные из нескольких таблиц, которые объединены в моей базе данных в представлении. В частности, я хочу распечатать адрес каждого свойства («адрес» из модели свойств) и соответствующий ему комментарий («comment_text» из модели интересов)

Вопросы:

1) Прямо сейчас я объединяю таблицы в представлении; однако я предполагаю, что это неверно, но я не уверен, как объединить их в контроллере. Должен ли я вообще присоединяться к таблицам внутри представления? Или это должно происходить в контроллере?

2) На мой взгляд, я хочу распечатать адрес и соответствующий текст комментария; однако, когда я пытаюсь распечатать прямо сейчас, он выглядит как активный объект связи с записью, т. Е. Показывает «[«test»]», и я хочу, чтобы он показывал «test»

Есть идеи? Код ниже:


Схема:

 create_table "interests", force: :cascade do |t|
  t.integer  "user_id"
  t.integer  "property_id"
  t.string   "interested",   default: "unknown"
  t.string   "comment_text"
  t.datetime "created_at",                       null: false
  t.datetime "updated_at",                       null: false
end

add_index "interests", ["property_id"], name: "index_interests_on_property_id"
add_index "interests", ["user_id"], name: "index_interests_on_user_id"

create_table "properties", force: :cascade do |t|
  t.string   "address"
  t.string   "city"
  t.string   "state"
  t.integer  "zip"
  t.datetime "created_at",                             null: false
  t.datetime "updated_at",                             null: false
end
  

Модели:

 class Property < ActiveRecord::Base
  has_many :interests
  has_many :users, through: :interests

  default_scope {order("id ASC")}
end

class Interest < ActiveRecord::Base
  belongs_to :property
  belongs_to :user

  validates :user_id, :presence => true
  validates :property_id, :presence => true
end
  

Контроллер:

 def index
  @properties = Property.all
end
  

Вид:

 <% @properties.each do |p| %>
    <td><%= p.interests.collect(amp;:comment_text) %>
<% end %>
  

Ответ №1:

1) Прямо сейчас я объединяю таблицы в представлении; однако я предполагаю, что это неверно, но я не уверен, как объединить их в контроллере. Должен ли я вообще присоединяться к таблицам внутри представления? Или это должно происходить в контроллере?

Ответ основан на мнении. Некоторые люди предпочитают DB-запросы в представлении для различных резонансов. Например, представления могут быть кэшированы, и поэтому вы не запрашиваете свою базу данных. Другие люди говорят, что это не относится к представлению по другим причинам, таким как лучшее тестирование. Таким образом, вы можете выбирать или следовать пути.

2) т.е. показывает «[«test»]», и я хочу, чтобы он показывал «test»

p.interests.collect(amp;:comment_text) возвращает массив. Erb выполняет косвенный вызов p.interests.collect(amp;:comment_text).to_s , поэтому вы получаете то, что видите.

Если вам нужен другой результат, вам нужно выполнить итерацию по вашим комментариям_текстов.

 <% @properties.each do |property| %>
     property.interests.each do |interest|
        <td><%=interest.comment_text %>
    <% end %>
<% end %>
  

Комментарии:

1. Спасибо slowjack! Не уверен, как я это пропустил, но это сработало!

Ответ №2:

Я думаю, было бы здорово, если бы вы использовали include.С помощью includes Active Record гарантирует, что все указанные ассоциации будут загружены с использованием минимально возможного количества запросов.

бывший контроллер:

 def index
 @properties = Property.includes(:interests)
end
  

Вид:

 <% @properties.each do |property| %>
  property.interests.each do |interest|
    <td><%=interest.comment_text %>
 <% end %>
<% end %>
  

Ref ActiveRecord Методы запроса