Has_many 通过并属于 Rails

Has_many through and belongs to in Rails

我正在开发一个 Rails 应用程序,用户可以在其中创建杂志,而另一个用户可以订阅该杂志。我想知道最好的方法。

目前我有一个订阅模型,该模型在创建时从当前用户构建,并将当前杂志作为 magazine_id 用户。这允许我有 user_ids 和 magazine_id 的 table。这允许我查看所有订阅,但这意味着我无法轻松查看某人订阅的所有杂志或查看某杂志的所有订阅者。

当我尝试使用 has_many :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
  has_many :subscriptions

end

订阅模式:

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

杂志型号:

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

希望这足以让别人弄清楚,如果没有,请向我询问其他代码或信息。

我认为这应该可行,但可能需要设置其他选项。

用户模型:

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

杂志型号:

class Magazine < ActiveRecord::Base
    belongs_to :user

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

编辑:需要来源,而不是 class_name

你非常接近,你只是错过了联系。 杂志可以看到订阅,因为订阅有它的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

如果这不起作用,请确保您 post 您的架构。rb/relevant 您提到的表中的字段。