在rails HABTM vs HM / BT中建模“喜欢”

时间:2014-06-26 22:26:24

标签: ruby-on-rails ruby activerecord social-networking

为我的应用程序在rails中为“喜欢”建模的最佳方法是什么。我可以做到以下几点:

class User < ActiveRecord::Base
  has_many :things

  has_many :likes
  has_many :liked_things, through: :likes, source: :thing
end

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :thing
end

class Thing < ActiveRecord::Base
  belongs_to :user

  has_many :likes
  has_many :liking_users, through: :likes, source: :user
end

或者

class User < ActiveRecord::Base
  has_many :things

  has_and_belongs_to_many :things
end

class Thing < ActiveRecord::Base
  belongs_to :user

  has_and_belongs_to_many :users
end

哪种方法最好,为什么?我计划在我的应用中提供一个活动源,如果这有助于确定最佳方法。

1 个答案:

答案 0 :(得分:2)

这个问题的答案取决于Like是否会有任何属性或方法。

如果存在的目的是UserThing之间的HABTM关系,那么使用has_and_belongs_to_many关系就足够了。在您的示例中,has_manybelongs_to是多余的。在这种情况下你需要的只是:

class User < ActiveRecord::Base
  has_and_belongs_to_many :things
end

class Thing < ActiveRecord::Base
  has_and_belongs_to_many :users
end

另一方面,如果你预计Like会有一个属性(例如,某些人真的喜欢什么,或喜欢它,等等),那么你可以做到< / p>

class User < ActiveRecord::Base
  has_many :likes
  has_many :liked_things, through: :likes, source: :thing
end

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :thing
end

class Thing < ActiveRecord::Base
  has_many :likes
  has_many :liking_users, through: :likes, source: :user
end

请注意,我删除了has_many :thingsbelongs_to :user,因为它们是多余的。