2013-12-07 3 views
0

У меня есть вопрос с моими нынешними ассоциациями активных записей.Ассоциация активных записей одна для многих

Я создаю систему комментирования, основанную на вопросе (очень похожа на stackoverflow).

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

Теперь, когда я делаю фактический комментарий, user_id должен быть включен в поле user_id моего комментария, так как я делаю ассоциацию, правильно?

Вот моя схема:

create_table "users", force: true do |t| 
    t.string "email",        default: "", null: false 
    t.string "encrypted_password",     default: "", null: false 
    t.integer "question_id",   limit: 255 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",      default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "provider" 
    t.string "uid" 
    t.string "name" 
    end 

create_table "comments", force: true do |t| 
    t.integer "user_id" **THIS IS WHERE I AM EXPECTING A JOIN AND WHEN A USER MAKES A COMMENT TO HAVE THE USER_ID NUMBER STORED HERE 
    t.integer "question_id" 
    t.text  "comment" 
    t.integer "upvotes" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Вот мои Active Record ассоциации:

USER.RB:

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :comments 
    has_many :votes 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, :omniauthable, 
     :recoverable, :rememberable, :trackable, :validatable 


     def self.from_omniauth(auth) 
     where(auth.slice(:provider, :uid)).first_or_create do |user| 
      user.provider = auth.provider 
      user.uid = auth.uid 
      # user.username = auth.info.nickname 
      user.email = auth.info.email 
      user.name = auth.info.name 
     end 
     end 

     def self.new_with_session(params, session) 
     if session["devise.user_attributes"] 
      new(session["devise.user_attributes"], without_protection: true) do |user| 
      user.attributes = params 
      user.valid? 
      end 
     else 
      super 
     end 
     end 

     def password_required? 
     super && provider.blank? 
     end 

     def update_with_password(params, *options) 
     if encrypted_password.blank? 
      update_attributes(params, *options) 
     else 
      super 
     end 
     end 
end 

Comment.rb:

class Comment < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 
    has_many :votes 
end 

Мои Конечная цель состоит в том, чтобы mments для регистрации user_id при создании нового комментария, связывая комментарий с пользователем.

Сейчас мой user_id является «ноль»

** Это рельсы бэкенд на Backbone фронтэнде

+0

Вы не разделили контекст (например, с кодом и выводом), где 'user_id' является' nil', поэтому трудно ответить на этот вопрос. –

+0

Извините Peter, это то, что вы ищете, это обычный запрос из моей консоли rails, это то, что Comment.last возвращает # <Комментарий id: 95, user_id: nil, question_id: 260, comment: «TEST22», upvotes: 0, created_at: "2013-12-07 20:19:03", updated_at: "2013-12-07 20:19:03"> – HelloWorld

+0

Хорошо, это объясняет, как вы его просматриваете, но все равно остается открытым вопрос о том, как вы его создали. Помог ли мой ответ? –

ответ

1

Нет, user_id поля соответствующей записи будет заполнено только в «автоматически», если вы создаете его через ассоциацию, как:

user.comments << Comment.create(...) 

См http://guides.rubyonrails.org/association_basics.html#has-many-association-reference другие варианты. Разумеется, вы также можете установить user_id вручную.

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