Rails новичок - я что-то упускаю действительно очевидное? - PullRequest
0 голосов
/ 31 января 2012

Довольно опытный, но самоучка с PHP / MySQL и игрой с Rails.Действительно люблю то, что я сделал с этим, но серьезно борюсь с тем, что, на мой взгляд, должно быть действительно простым;объединяя данные из разных таблиц вместе, а затем отображая их в различных представлениях.Я думаю, что у меня есть концепция Active Record, я просто не могу заставить ее работать так, как мне хочется.

Я работаю над созданием довольно сложной системы каталогизации музыки, как Discogs, с артистом,уровни выпуска, продукта, отслеживания и маркировки и имеют следующие модели:

class Artist < ActiveRecord::Base
  has_and_belongs_to_many :releases
end

class Release < ActiveRecord::Base
has_many :products
end

class Product < ActiveRecord::Base
belongs_to :release
has_many :tracks
end

class Tracks < ActiveRecord::Base
has_and_belongs_to_many :products
end

В конце концов, я хочу представить информацию о территориях, продажах и других данных, но пока я не угадаю основы выше, я не могу двигаться вперед.

В моем контроллере продуктов у меня есть:

@product = Product.find(:all, :include => :release)

, который производит:

Processing by ProductsController#index as HTML
Product Load (0.1ms)  SELECT "products".* FROM "products" 
Release Load (0.2ms)  SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4)

Но я думаю, что это может быть ненужным, если мои ассоциации верны?

Например, в моем представлении продуктов я хочу перечислить продукты с заголовком, извлеченным из таблицы выпусков.Я попробовал следующее, но получил 'NoMethodError' для заголовка:

<% @product.each do |product| %>

<tr>    
<td><%= product.title %></td>
<td><%= product.cat_no %></td>
<td><%= product.barcode %></td>
<td></td>

</tr>
<% end %>

Помощь !!

Огромное спасибо заранее.

Райан

Ответы [ 3 ]

0 голосов
/ 31 января 2012

проблема:

Я попробовал следующее, но получил 'NoMethodError' для заголовка:

по его коду:

<td><%= product.title %></td>

Мне интересно, пропустили ли вы столбец "title" в своей таблице "product", и я предлагаю вам проверить структуру таблицы, чтобы убедиться, что этот столбец существует.

0 голосов
/ 31 января 2012

Возможно, попробуйте "rake db:migrate" в вашей консоли, чтобы обновить базу данных.Если вы сгенерировали модель продукта, но не запомнили перенос базы данных, таблица не будет в базе данных.Возможно, вы также забыли добавить product.title в качестве переноса / части вашей базы данных.

0 голосов
/ 31 января 2012
Release Load (0.2ms)  SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4)

Вышеупомянутый запрос сгенерирован, потому что вы использовали: include =>: association (: release в вашем случае) в методе find. Это свойство Rails называется готовой загрузкой, широко используемой для оптимизации производительности. Нет проблем в Ваше объединение, я думаю.

Если вы использовали

@ products = Product.all

А на вашей странице просмотра

<% @product.each do |product| %>
 <tr>    
  <td><%= product.title %></td>
  <td><%= product.cat_no %></td>
  <td><%= product.barcode %></td>
  <td><%= product.release.name %></td>
 </tr>
<% end %>

Вызов метода product.release создаст вышеуказанный запрос для числа n выполненных циклов (n обращений к базе данных)

Если вы используете опцию: include, этого можно избежать. Rails предварительно загружает связанную ассоциацию (: release). (Только 1 попадание в базу данных)

Для более подробной информации посетите

http://guides.rubyonrails.org/active_record_querying.html

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

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