0
class Post < ActiveRecord::Base 
    has_one :owner, class_name: "User", foreign_key: "owner_id" #creator post 
    has_many :users #followers post 
end 

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

has_many :posts 
end 

Какую командную строку мне нужно выполнить для миграции для выполнения этих разных отношений между таблицами User и Post? БлагодаряМиграция has_one и has_many

+0

Как настроить миграцию, о которой вы просите? –

+0

Да, я не могу установить его ... –

+0

У вас уже есть эти таблицы 'posts' и' users'? –

ответ

1

Post должен belong_to:owner, потому что posts таблица имеет внешний ключ. Кроме того, его #users немного неоднозначно назван, как и User#posts.

Вот ваши модели:

class Post < ActiveRecord::Base 
    belongs_to :owner, class_name: 'User', inverse_of: :owned_posts # foreign_key: :owner_id will be inferred 
    has_many :subscriptions 
    has_many :followers, through: :subscriptions, source: :user, class_name: 'User', inverse_of: :followed_posts 
end 

class Subscription < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :owned_posts, class_name: 'Post', inverse_of: :owner 
    has_many :subscriptions 
    has_many :followed_posts, through: :subscriptions, source: :post, class_name: 'Post', inverse_of: :followers 
end 

И здесь миграции, чтобы поддержать их:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     # ... 
    end 
    end 
end 

class CreatePosts < ActiveRecord::Migration 
    def change 
    create_table :posts do |t| 
     t.integer :owner_id 
     # ... 
    end 
    end 
end 

class CreateSubscriptions < ActiveRecord::Migration 
    def change 
    create_table :subscriptions do |t| 
     t.integer :post_id 
     t.integer :user_id 
    end 
    end 
end 

Если бы это было не для «собственности» отношений, вы могли бы использовать has_and_belongs_to_many Отношения:

  1. переименовать subscriptions миграции в posts_users (должно быть множественном в алфавитном порядке),
  2. избавиться от своей модели целиком и
  3. имеет Post.has_and_belongs_to_many :users и User.has_and_belongs_to_many :posts.

В самом деле, вы технически могли сделать это, но имеющие неоднозначные имена, как это плохая практика.

+0

Большое вам спасибо, но у меня возникла проблема при создании новой «подписки», идентификатор сообщения не сохраняется, возможно, проблема заключается в следующем: 'def subscription_params params.require (: subscription) .permit (: user_id,: post_id) end' –

+0

Это звучит как отдельный вопрос. Я думаю, что вы, скорее всего, не захотите напрямую манипулировать подписками, но используйте такие действия, как '@post.followers << current_user' в действии на контроллере * posts *. – PJSCopeland

+0

'@post.followers << current_user' генерировать ошибку:' NameError: uninitialized constant Post :: Follower'. Когда я создаю подписку, у меня есть эта ошибка: 'Параметр unpermitted: post_id ' Я проверил несколько раз правильные настройки! –

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