Has_many通过并属于Rails

时间:2015-08-28 15:53:35

标签: ruby-on-rails ruby ruby-on-rails-3 entity-relationship has-many-through

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

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

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

希望这对于某人来说已经足够了解,如果没有,请向我询问其他代码或信息。

Error

2 个答案:

答案 0 :(得分:2)

你非常接近,你只是错过了连接。 杂志可以看到订阅,因为订阅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 /相关字段。

答案 1 :(得分:-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

杂志模特:

class Magazine < ActiveRecord::Base
    belongs_to :user

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

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