Rails ActiveRecord两个模型之间的关联

时间:2012-12-21 12:47:07

标签: ruby-on-rails

我有两个模型usercard,我希望建立一个关联,其中user has_many :cards但所有人都可以查看卡片。所以card belongs_to :user但是其他任何人都可以查看它们。

如何在Rails中设置此关联?

2 个答案:

答案 0 :(得分:0)

无需在两个模型之间设置关联。只需确保您的查看操作(可以命名为index)即可查看所有卡片。

答案 1 :(得分: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 =&gt; false”约束的一些解释,以及“:default =&gt; 0”

“not null”约束将阻止卡不属于用户。所以一张卡必须有一个相关的用户!如果它不应该总是这样,那么只需删除“:null =&gt; false”约束。

默认=&gt; 0表示已为已创建的卡设置user_id的默认值。否则,如果您使用“:null =&gt; false”约束,则会引发错误。当然,您必须删除这些卡或正确设置其“user_id”属性。


然后,不要忘记要创建属于用户的卡,您必须这样做:new_card = current_user.cards.build,此代码将自动填写“user_id”属性与“ current_user.id“值。

然后获取用户的卡片只需执行:current_user.cards(其中current_user是查看其配置文件的用户)。 要获得所有卡片,无论用户如何,只需执行:Card.all

如果要过滤对某些卡的访问权限,则必须在控制器中执行此操作,这与关联无关;)在卡和用户之间建立关联不会对从中访问对象产生任何影响卡片型号。