2012-03-07 1 views
0

У меня есть проблема на данный момент, и я не знаю, что мне делать. Это в отношении отношений между таблицами и нужны ли мне иностранные ключи .Добавление внешних ключей в базу данных рельсов

У меня есть две таблицы в моей базе данных; пользователей и игр. Пользователи включают все информацию о пользователе (имя пользователя, адрес электронной почты, адрес и т. Д.). Игры включает в себя всю информацию о играх (имя, жанр, консоль user_id). Как , вы, возможно, заметили, что таблица игр включает в себя идентификатор пользователей, чтобы ассоциировать отношения между двумя, для каждой игры которых требуется связанный пользователь .

То, что я хочу сделать, это на каждой странице Игр show.html.erb, у меня есть кнопка , которая должна отправить письмо владельцу этой игры, чтобы позволить их теперь, что в настоящее время регистрируется пользователь заинтересованы в торговле, что игры.

Мне интересно, как я это сделаю. Пользователь user_id автоматически связывает все данные, связанные с пользователями, или только идентификатор. Если нет, то как бы я объявить электронную почту пользователей в качестве внешнего ключа, чтобы я мог позвонить по адресу электронной почты для отправки?

Любая помощь будет высоко оценена. Спасибо

Кристофер Джонс

UPDATE

Эй, я имел следующее в моем games_controller шоу раздела и это не сработало. Это породило следующую ошибку: неопределенный метод `email 'для« [email protected] »: String.

def show 
@game = Game.find(params[:id]) 

respond_to do |format| 
    GameTrade.game_interest(@game.user.email).deliver 
    format.html { redirect_to root_url } 
    format.json { render json: @game } 
end 
end 

Так что я изменил его на следующее для того, чтобы сломать эту проблему и выяснить, какую линию она сломалась, и он заявил, что блок был на линии 19, которая является линией г = GameTrade.game_interest (электронная почта). Я получил следующее сообщение об ошибке:

неопределенный метод `электронной почты» для "[email protected]": String

Есть идеи? код ниже

def show 
    @game = Game.find(params[:id]) 

respond_to do |format| 
    user = @game.user 
    email = user.email 
    g = GameTrade.game_interest(email) 
    g.deliver 
    format.html { redirect_to root_url } 
    format.json { render json: @game } 
end 
end 

Следующий код является то, что мой Game_trade.rb в разделе почтовой программы:

class GameTrade < ActionMailer::Base 
    default :from => "[email protected]" 

    def game_interest(user) 
     @user = user 
     mail :to => user.email, :subject => "Game Interest" 
    end 
    end 
+0

Вы говорите о реальных FK в базе данных или опции ': foreign_key' для некоторых ассоциаций Rails? –

+0

Эй, я хочу поместить внешний ключ, чтобы при нажатии кнопки он отправил электронное письмо на адрес электронной почты пользователей. Поле электронной почты не существует в таблице игр, только пользователи, и у меня есть user_id в играх, но я не думаю, что это дает доступ к электронной почте пользователей. – user1222136

+0

Эй, я обновил свой вопрос выше, чтобы дать больше информации о том, что я хочу делать. – user1222136

ответ

2

Посмотрите на this Stack Overflow question regarding Rails and referential integrity. Вы можете захотеть изучить жемчужину foreigner для добавления и удаления внешних ключей во время миграции Rails.

Однако мне любопытно, почему вы создаете ограничения внешнего ключа за пределами игры-> пользовательского ограничения, которое у вас уже есть. Есть ли причина, по которой вы денормализуете поля имени пользователя и электронной почты?

+0

Причина, по которой мне нужно ввести пользовательскую электронную почту в каждую игру, потому что мне нужна кнопка в игровой зоне, которая, если вы нажмете, отправит электронное письмо пользователю, который связан с этим адресом электронной почты. Это имеет смысл для вас? – user1222136

+0

Эй, я обновил свой вопрос выше, чтобы дать больше информации о том, что я хочу делать. – user1222136

+0

Если вы правильно установили отношения, вы можете просто называть 'game.user.email' - т. Е. Извлекать запись' User', связанную с 'Game', а затем извлекать атрибут' mail' этого 'User '. Если вы размещаете адрес электронной почты пользователя непосредственно в игре, что происходит, когда пользователь обновляет свой адрес электронной почты? Теперь вам нужно обновить каждую игру, связанную с этим пользователем, а не одну запись «User». – Brandan

1

Линия GameTrade.game_interest(@game.user.email).deliver
вызывает метод game_interest в модели GameTrade.
(Пожалуйста, отправьте этот код также.)

Этот метод ожидает параметр, и он не получает его.

Я хотел бы также рассмотреть возможность как метод, и вызов будут для
game_interest_deliver(@game.user.email).

Я работал в SQL хранилищ данных в течение 5 лет, и я был очень смущен рельсами и внешними ключами на начальном этапе. Основной урок, который я узнал, не добавляет их по мере необходимости, а больше сосредотачивается на рубиновом коде и моделях и методах для достижения правильных результатов.

+0

Эй, Майкл, я обновил сообщение с классом почтовой программы для Game_trade внизу. – user1222136

+0

Я также исправил ошибку, которая выводится в коде. – user1222136

+0

OP использует правильные соглашения для ActionMailer. Ваш метод «уведомления» возвращает объект «Mail :: Message» (результат вызова «mail»), а затем вы вызываете «доставить» на этот объект для отправки сообщения. Я также думаю, что правильно передать объект «Пользователь» методу, чтобы он был доступен для представления, которое отвечает за построение самого сообщения электронной почты. – Brandan

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

  • Нет связанных вопросов^_^