Rails:维护id列表的最佳实践

时间:2014-11-02 04:33:33

标签: ruby-on-rails ruby ruby-on-rails-4

我还是铁杆新手,所以如果这个问题是基本的,我会提前道歉。

我希望用户能够从另一个表中选择一些固定数量的行作为该表中的“最喜欢”元素。目前,我实现这一点的方法是向用户模型添加n个整数列。这些整数将作为外键用作另一个表,用户从中选择收藏夹。这些列默认为0.当用户编辑(添加或删除)收藏夹时,代码必须迭代这些元素并相应地重置它们。

有没有更好的方法来实现此功能?我不认为它可以使用活动记录关联来实现。如果我错了,请纠正我。

谢谢!

1 个答案:

答案 0 :(得分:1)

让我们假设您有模型[用户和项目],用户可以在其中收藏项目。 由于该关系是双向的,(用户可以喜欢很多项目)和(项目可以被多种用途所青睐)。因此,我们将使用has_and_belongs_to_many关联。

我们将创建一个表users_favourite_items,其中包含数据的元组行:[user1_id,item1_id]

class Item < ActiveRecord::Base
  has_and_belongs_to_many :users,
      :association_foreign_key => 'user_id',
      :class_name => 'User',
      :join_table => 'users_favourite_items'
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :items,
    :association_foreign_key => 'item_id',
    :class_name => 'Item',
    :join_table => 'users_favourite_items'
end
Then need to create new users_favourite_items migration like below.

class CreateUsersFavouriteItemsTable < ActiveRecord::Migration
  def self.up
    create_table : users_favourite_items, :id => false do |t|
      t.references :item
      t.references :user
    end
    add_index :users_favourite_items, [:item_id, :user_id]
    add_index :users_favourite_items, [:user_id, :item_id]
  end

  def self.down
    drop_table :users_favourite_items
  end
end