Использование: присоединяется в Ruby on Rails 3 - PullRequest
0 голосов
/ 27 января 2011

Поздравления У меня есть таблицы 3 дБ:

Типы Я бы Имя

Источники Я бы название type_id

Операция Я бы source_id комментарий ...

и модели для каждого:

class Type < ActiveRecord::Base
  has_many :sources, :dependent => :destroy
end

class Source < ActiveRecord::Base
  belongs_to :type
  has_many :operations, :dependent => :destroy
end

class Operation < ActiveRecord::Base
  belongs_to :source
  default_scope :order => 'created_at DESC'
end

В Operation # index controller у меня есть код для получения данных (сгенерированных скаффолдингами)

@operations = Operation.all

И часть представления operations / index.html.erb , также сгенерированная скаффолдингом

<% @operations.each do |operation| %>
  <tr>
    <td><%= operation.source_id %></td>
    <td><%= operation.comment %></td>
  </tr>
<% end %>

Теперь я хочу использовать source.name вместо * operation.source_id *

Я пытался сделать:

-заменить operation.source_id на operation.sources.name # не работает

- попытался использовать: присоединяется и не может получить поля таблицы источников

irb(main):057:0> Operation.first( :joins => :source )
=> #<Operation id: 2088, source_id: 1, summ: 10.0, comment: "", created_at: "2011-01-01 07:39:45", updated_at: nil>

или

irb(main):063:0> Operation.first( :joins => 'INNER JOIN sources ON operations.source_id = sources.id' )
=> #<Operation id: 2088, source_id: 1, summ: 10.0, comment: "", created_at: "2011-01-01 07:39:45", updated_at: nil>

Как правильно использовать : объединения для получения дополнительного поля? Или есть другой подход для получения данных комбинированных таблиц.

И почему в operations / show.html.erb я могу использовать <% = @ operation.source.name%> и успешно получить source.name , но в * operations / index.html.er * b нельзя

Ответы [ 2 ]

2 голосов
/ 27 января 2011
<% @operations.each do |operation| %>
  <tr>
    <td><%= operation.source.name %></td>
    <td><%= operation.comment %></td>
  </tr>
<% end %>

Я бы также рекомендовал изменить метод #index на использование оператора includes, чтобы избежать ситуации N + 1 (т. Е. Выполнить отдельный запрос к базе данных для каждого источника отдельной операции).

@operations = Operation.includes(:source).all
0 голосов
/ 27 января 2011

Решено:

# opearions индекс

@operations = Operation.all :joins => :source, :select => '*'

Операции / index.html.erb

<% @operations.each do |operation| %>
  <tr>
    <td><%= operation.name %></td>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...