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
Отношения:
- переименовать
subscriptions
миграции в posts_users
(должно быть множественном в алфавитном порядке),
- избавиться от своей модели целиком и
- имеет
Post.has_and_belongs_to_many :users
и User.has_and_belongs_to_many :posts
.
В самом деле, вы технически могли сделать это, но имеющие неоднозначные имена, как это плохая практика.
Как настроить миграцию, о которой вы просите? –
Да, я не могу установить его ... –
У вас уже есть эти таблицы 'posts' и' users'? –