#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 %>