rails has_many_through вопрос вставки данных - PullRequest
0 голосов
/ 22 мая 2011

У меня есть сценарий, в котором модели выглядят как

create_table :users do |t|
  t.string :name
  t.timestamps
end

create_table :blogs do |t|
  t.string :url
  t.string :title
  t.text :description
  t.timestamps
end

create_table :posts do |t|
  t.integer :user_id, :null => false
  t.integer :blog_id, :null => false
  t.text :post_text
end

class Blog < ActiveRecord::Base
  has_many :users, :through =>:posts
  has_many :posts, :dependent=>true
end

class User < ActiveRecord::Base
  has_many :blogs
  has_many :posts, :through=>:blogs
end

class Post < ActiveRecord::Base
  belongs_to :blog
  belongs_to :user
end

У меня такой вопрос: 1. Когда пользователь создается, я хотел бы автоматически создать для него блог.

@ user = User.find_or_create_by_name (user_name)

Как мне создать блог?@blog = Blog.find_or_create_by_user_id (@user)

Я получаю следующую ошибку:

undefined method `find_or_create_by_user_id' for #<Class:0x1044735b0>

@blogs = @user.blogs

дает мне:

 Mysql::Error: Unknown column 'blogs.user_id' in 'where clause': SELECT * FROM `blogs` WHERE (`blogs`.user_id=1234)

Я знаю, что в таблице блогов нетесть столбец user_id.Но разве объединение не должно заботиться об этом?Что я тут не так делаю?

Спасибо за помощь

1 Ответ

2 голосов
/ 22 мая 2011

Чтобы использовать модель Post в качестве таблицы ассоциации, модель User должна быть настроена для правильной демонстрации ассоциации.После этого вы можете использовать after_create для создания нового блога для вновь созданного пользователя.

class User < ActiveRecord::Base
  has_many :posts
  has_many :blogs, :through=>:posts
  after_create :add_blog

  private
  def add_blog
    blogs << Blog.new
  end

end

РЕДАКТИРОВАТЬ:

Лучшее, что я знаю, как это сделать, это объяснить, что я«думай», что отношения пытаются достичь, тогда ты скажешь мне, где я, и мы идем оттуда.

1) Пользователь может «владеть» многими блогами

2) В блоге может быть много сообщений

3) Сообщение принадлежит одному пользователю и одному блогу

4) блог может иметь только одного «владельца» (пользователя)

5) Блоги могут «принадлежать» многим пользователям, что дает им разрешение на публикацию.

Если 1-4 являются истинными, а 5 ложными ... это не сценарий "has_many: through" или отношения "многие ко многим", а только отношения "один ко многим".

Соответственно, сообщения не должны использоваться в качестве таблицы ассоциации.Таблица ассоциации не нужна.

добавьте t.integer :user_id, :null => false в таблицу блогов

class Blog < ActiveRecord::Base
  belongs_to :users, 
  has_many :posts, :dependent=>:destroy # rec'd error in RoR3... replaced true with :destroy
end

class User < ActiveRecord::Base
  has_many :blogs, :dependent=>:destroy
  has_many :posts
  after_create :add_blog

  private
  def add_blog
    blogs << Blog.new
  end
end

class Post < ActiveRecord::Base
  belongs_to :blog
  belongs_to :user
end

Если 5 истинно, это будет истинным множителем ...но я не думаю, что вы пытаетесь это сделать.

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