0

Я работаю над приложением Rails, где Пользователь может создать журнал, а другой пользователь может подписаться на этот журнал. Я хочу знать, как это сделать.Has_many через и принадлежит Rails

В настоящее время у меня есть модель подписки, которая строится от текущего пользователя при создании и пользователей текущего журнала как magazine_id. Это позволяет мне иметь таблицу user_ids и magazine_ids. Это позволяет мне видеть все подписки, но это означает, что я не могу легко проверить все журналы, на которые вы подписались, или проверить всех подписчиков журнала.

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

модель Пользователь:

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 :magazines 
    has_many :subscriptions 

end 

Подписка модель:

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

Magazine модель:

class Magazine < ActiveRecord::Base 
    belongs_to :user 

    has_many :subscrptions 
    has_many :users 
end 

Фрагмент кода от контроллера подписки, который подбрасывает ошибку, когда я использую имеет много до

def new 
     @subscription = current_user.subscriptions.build 

     @sub = Sub.find(params[:sub_id]) 

    end 

Надеюсь, этого достаточно, чтобы кто-то мог выяснить, если нет, пожалуйста, запросите у меня другой код или информацию.

Error

+0

Пожалуйста, разместите ошибку с полным журналом ошибок – Pavan

+0

Я добавил, что скриншот страницы с ошибкой достаточно? – ZSOR

ответ

2

Вы очень близки , ты просто ошибаешься петь соединение. Magazine можно посмотреть ПодписаноПодписано имеет magazine_id. Пользователь можно посмотреть ПодписаноПодписано имеет user_id. Через Подписки, Журнал и Пользователь может видеть друг друга. Итак, вы хотите, чтобы пользователь through

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 :magazines, through: :subscriptions 
    has_many :subscriptions 
end 

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

class Magazine < ActiveRecord::Base 
    belongs_to :user 

    has_many :subscriptions 
    has_many :users, through: :subscriptions 
end 

Если это не работает, убедитесь, что вы размещаете свои schema.rb/соответствующие поля из таблиц, которые вы упомянули.

+0

Чувак, спасибо вам большое, я потратил годы, пытаясь понять, почему он не работает, когда он должен быть. Я знал, что это было бы что-то маленькое: D. Итак, теперь я могу узнать все журналы, к которым пользователь подписывается, делая user.magazines? – ZSOR

+0

Да! И вы можете заставить всех пользователей подписаться на журнал, делая 'magazine.users' –

+0

Эй, Еще один вопрос, есть ли способ остановить избыточность/дубликаты, потому что сейчас может быть несколько записей с одним и тем же пользователем и журналом id в них. Заранее спасибо. – ZSOR

-1

Я думаю, что это должно работать, возможно, потребуется установить дополнительные опции, хотя.

модель

Пользователь:

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 :magazines 
    has_many :subscriptions 
    has_many :subscribed_magazines, through: :subscriptions, source: :magazine 

end 

Подписка модель:

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

Magazine модель:

class Magazine < ActiveRecord::Base 
    belongs_to :user 

    has_many :subscriptions 
    has_many :subscribed_users, through: :subscriptions, source: :user 
end 

Edit: Необходим источник, не CLASS_NAME

+0

Я пробовал использовать этот код, но получаю ту же ошибку, я добавил скриншот страницы с ошибкой. У меня такое чувство, что это что-то довольно основное, что я только что пропустил, но я не вижу этого. – ZSOR

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