0

単純な関係を作成しようとしていますが、Rails 3.2 の下のサブディレクトリにモデルがあります

私には User クラスがあり、各ユーザーには電子メールのサブスクリプションがあります。他のタイプのサブスクリプションがあるため (これもユーザーに追加されます)、サブディレクトリに配置します。(私のユーザーはたまたまDeviseから来ていますが、それは問題ではないと思います。)

これがコードです

model/user.rb

class User < ActiveRecord::Base
  has_one :email_sub

  before_create :build_email_subscription

  private

  def build_email_subscription
    Subscription::EmailSub.create(:is_subscribed => true, :user_id => self.id)
    true
  end
end

デフォルトのサブスクリプションを追加する方法も作成したことに注意してください。

model/subscriptions/email_sub.rb

class Subscriptions::EmailSub < ActiveRecord::Base
  belongs_to :user
end

2 つのクラスを作成するための移行に加えて、関係のために次の移行を作成しました。

class AddSubscriptionToUser < ActiveRecord::Migration
  def change_table :subscriptions_email_sub do |t|
    t.referneces :users
  end
end

ただし、これは機能していないようです。user_id列を生成していないようです。

4

2 に答える 2

1

私はそれを働かせたようです。他の人が学べるように、結果を共有して注釈を付けています。

model/user.rb

class User < ActiveRecord::Base
  has_one :email_sub, :class_name => "Subscriptions::EmailSub"

  before_create :build_email_subscription

  private

  def build_email_subscription
    build_email_sub(:announcements => true, :notifications => true, :master => true)
    true
  end
end

class_nameサブディレクトリでモデルを見つけるために、明示的に を含めます。を使用してbuild_<attribute>、3 つのサブスクリプションのパラメーターを渡しました (後でフォームから入力しますが、今はデフォルトを設定するだけです)。

model/subscriptions/email_sub.rb

class Subscriptions::EmailSub < ActiveRecord::Base
  attr_accessible :announcements, :daily_deals, :master
  belongs_to :user
end

(属性は問題とはあまり関係がないため省略しましたが、初心者向けにここに明示的に含めておきます。)

新しい移行の代わりに、EmailSubs モデルの元の移行を変更しました。

class CreateSubscriptionsEmailSubs < ActiveRecord::Migration
  def change
    create_table :subscriptions_email_subs do |t|
      t.boolean :master
      t.boolean :daily_deals
      t.boolean :announcements

      t.references :user    # I added this line to the generated migration
      t.timestamps
    end
  end
end

行を追加しましたt.references。以前は複数形で単数形ではなかったことに注意してください(移行では、テーブル名は複数形で、フィールドは単数形である必要があります)。t.references は、指定された _id フィールドを探すことを認識します。

うまくいけば、これは他の人たちの時間を節約するのに役立ちます.

于 2012-08-23T02:27:37.260 に答える
0

モデルの設定方法をやり直します。Rails が自動的に作成するリレーションシップ テーブルを試して編集するのは良い習慣ではないと思います。

モデル user.rb の場合

class User < ActiveRecord::Base
    has_many :subscriptions
    // Put whatever before_create logic here if that's still working correctly
end

subscription.rb を次のように変更します。

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

次に、別のモデル、subscription_type.rb を作成します。

class SubscriptionType < ActiveRecord::Base
    has_many :subscriptions
end

このモデルには、id、subscription_id、および subscription_type_id の 3 つの列があります (おそらく、subscription_type_name 列も含まれます)。次に、subscription_type_id の 1 は電子メールの購読、2 は雑誌の購読などの規則を作成します。別の方法として、購読モデルに subscription_type 列を追加することもできます。

モデル内の列を簡単に確認するには、annotate gemを使用します。使用方法に関する簡単なチュートリアルを次に示します。

于 2012-08-23T00:02:45.163 に答える