0

私は 2 つのモデルを持っておりuser、誰でもカードを表示できるcard関連付けを確立したいと考えています。user has_many :cardsだからcard belongs_to :user、他の誰でもそれらを見ることができます。

Railsでこの関連付けを設定するにはどうすればよいですか?

4

2 に答える 2

0

2 つのモデル間の関連付けを設定する必要はありません。表示アクション ( という名前にすることもできますindex) がすべてのカードを表示することを確認してください。

于 2012-12-21T12:49:00.270 に答える
0

それは本当に複雑ではありません。あなたが説明した関連付けを行うだけです:

class User < ActiveRecord::Base
  has_many :cards, :dependent => :destroy #so when you delete a user, his cards will be deleted
end

class Card < ActiveRecord::Base
  belongs_to :user
  # The cards table must have the column "user_id", just do a migration to add it
end

# The migration would be something like:
def change
  add_column :cards, :user_id, :integer, :default => 0, :null => false

  add_index :cards, :user_id #it's better to add an index cause you'll surely often get cards from user_id
end

編集:「null => false」制約と「:default => 0」に関するいくつかの説明

「not null」制約は、カードがユーザーに属さないことを防ぎます。したがって、カードにはユーザーが関連付けられている必要があります。常にそうであるとは限らない場合は、「:null => false」制約を削除してください。

デフォルト => 0 は、すでに作成されたカードのデフォルト値を user_id に設定するためにあります。それ以外の場合、「:null => false」制約を使用するとエラーが発生します。もちろん、それらのカードを削除するか、「user_id」属性を適切に設定する必要があります。


次に、ユーザーに属するカードを作成するには、そのようにする必要があることを忘れないでください:new_card = current_user.cards.buildこのコードは、「user_id」属性に「current_user.id」値を自動的に入力します。

次に、ユーザーのカードを取得するには、次のようにしますcurrent_user.cards(current_user は、プロファイルを表示しているユーザーです)。そして、ユーザーに関係なくすべてのカードを取得するには、次のようにします。Card.all

一部のカードへのアクセスをフィルタリングしたい場合は、コントローラーでそれを行う必要があります。これは関連付けとは関係ありません;) カードとユーザーを関連付けても、Card モデルからのオブジェクトへのアクセスには影響しません。 .

于 2012-12-21T12:57:35.930 に答える