私は 2 つのモデルを持っておりuser
、誰でもカードを表示できるcard
関連付けを確立したいと考えています。user has_many :cards
だからcard belongs_to :user
、他の誰でもそれらを見ることができます。
Railsでこの関連付けを設定するにはどうすればよいですか?
私は 2 つのモデルを持っておりuser
、誰でもカードを表示できるcard
関連付けを確立したいと考えています。user has_many :cards
だからcard belongs_to :user
、他の誰でもそれらを見ることができます。
Railsでこの関連付けを設定するにはどうすればよいですか?
2 つのモデル間の関連付けを設定する必要はありません。表示アクション ( という名前にすることもできますindex
) がすべてのカードを表示することを確認してください。
それは本当に複雑ではありません。あなたが説明した関連付けを行うだけです:
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 モデルからのオブジェクトへのアクセスには影響しません。 .