2014-02-20 6 views
1

Я пытаюсь присоединиться к двум уже существующим таблицам «Отчет» и «Личность», создав новую таблицу соединений «LastViewer». В принципе, таблица Viewer будет отслеживать, какой человек последний раз просматривал отчет.Rails Model/Join table не работает должным образом

Я создал Rails модели, создав файл «last_viewer.rb», как это:

class LastViewer < ActiveRecord::Base 
    belongs_to :report 
    belongs_to :person 
end 

Это породило следующую миграцию:

class CreateLastViewers < ActiveRecord::Migration 
    def change 
    create_table :last_viewers do |t| 
     t.references :person 
     t.references :report 

     t.timestamps 
    end 
    add_index :last_viewers, :person_id 
    add_index :last_viewers, :report_id 
    end 
end 

Теперь, я начал добавлять код так, что мой приложение будет отслеживать изменения. Я добавил следующее к соответствующему контроллеру:

@viewer = LastViewer.new 
@viewer.person_id = get_current_user[:id] # correctly gets the person's ID from the correct session 
@viewer.report_id = @report.id 
@viewer.save 

И теперь, к мнению я хотел, чтобы отобразить последний зритель, я добавил:

<% @reports.each_with_index do |report,index| %> 
    <% query = LastViewer.where(:report_id => report.id).last %> 
    <% name = query.person.name || "No Person found" %> 
    <% time = Format.to_time(query.created_at.localtime) %> 
<% end %> 

Ошибки я получаю:

неопределенный метод `имя» для ноль: NilClass

на линии

<% name = query.person.name || "No Person found" % 

Edit:

Соответствующая часть модели Person:

class Person< ActiveRecord::Base 
    attr_accessible :hid, :name, :email, :cell, :display 
    has_many :last_viewer 
end 

Соответствующая часть отчета модели:

class Report< ActiveRecord::Base 
    has_many :last_viewer 
end 
+0

ли get_current_user [: идентификатор] ничего возвращать? Вы определили has_many: через ассоциации на ваших присоединенных моделях? – DiegoSalazar

+0

Убедитесь, что ваша модель требует, чтобы оба внешних ключа успешно сохранялись: 'validates: report_id,: person_id, наличие: true' в вашей модели LastViewer – MrYoshiji

+0

Да, get_current_user [: id] возвращает правильную строку/имя (я ее протестировал). И мне жаль, что вы подразумеваете под второй частью? Я добавлю модели Report и Person, если это поможет –

ответ

1

Во-первых, вы должны изменить ваши отношения к этому: (множественное число от has_many :last_viewers)

class Person < ActiveRecord::Base 
    has_many :last_viewers 


class Report < ActiveRecord::Base 
    has_many :last_viewers 

class LastViewer < ActiveRecord::Base 
    belongs_to :report 
    belongs_to :person 
    validates :report_id, :person_id, presence: true 

Затем попробуйте форсировать создание объекта LastViewer , чтобы вызвать ошибку и посмотреть, что случилось с вашим объектом:

@viewer = LastViewer.new 
@viewer.person_id = get_current_user[:id] 
@viewer.report_id = @report.id 
@viewer.save! # adding a ! will raise errors if object not valid 

# one-line equivalent: 
@viewer = LastViewer.create!(person_id: get_current_user[:id], report_id: @report.id) 

Я уверен, что это будет ошибка, как «person_id не должно быть пустым». Я думаю, что ваш метод get_current_user[:id] не возвращает идентификатор.

После устранили эту проблему, я рекомендую вам реорганизовать ваш взгляд:

<% @reports.each_with_index do |report, index| %> 
    <% last_viewer = report.last_viewers.last %> 
    <% last_person_name = last_viewer.try(:person).try(:name) %> 
    <% time = Format.to_time(query.created_at.localtime) %> 
<% end %> 
+0

Вы были правы относительно get_current_user [: id], который вернул скрытый объект, а не id. Теперь он работает, когда я просматриваю таблицу Person, где hid = get_current_user [: id], а затем захватывает идентификатор результирующего пользователя. Большое вам спасибо, ваш вход взломал случай! :) –

2

query.person равна нулю. Вы можете использовать try, чтобы предотвратить ошибку:

<% name = query.person.try(:name) || "No Person found" %> 
+0

Это исправило ошибку, но теперь она просто печатает «No Person found» (как и предполагалось, очевидно).Вы видите какую-либо другую потенциальную ошибку? Это мой первый раз, когда я присоединяюсь к столам, поэтому я не уверен, что сделал это правильно. –

+1

Как и другие, предположим, что 'get_current_user [: id]' скорее всего не вернет идентификатор, который, по вашему мнению, должен вернуться. Он должен возвращать первичный ключ ('id') из объекта Person. –

+0

Прошу прощения, но по первому ключевому идентификатору вы имеете в виду идентификатор индекса этого Person в таблице Person, правильно? –

Смежные вопросы