Rails:确保两个表“同步”

时间:2014-08-21 22:03:27

标签: ruby-on-rails rails-activerecord

关系:

  • Team有很多Rosters
  • Team有很多Announcements
    • Announcement有一个AnnouncementRoster

创建Announcement时,用户必须为其分配Roster(其数据将用于创建新的AnnouncementRoster)。

我的模特:

class User < ActiveRecord::Base
  has_many :roster_players
  has_many :rosters, -> { uniq } ,  :through => :roster_players
  has_many :announcement_rosters, -> { uniq } ,  :through => :announcement_players
end

class Roster < ActiveRecord::Base
  has_many :roster_players
  has_many :users, -> { uniq }, through: :roster_players
end

class RosterPlayer < ActiveRecord::Base
  belongs_to :roster
  belongs_to :user
  validates :user_id, :uniqueness => { :scope => :roster_id }
end


class Announcement < ActiveRecord::Base
  has_one :announcement_roster
end

class AnnouncementRoster < ActiveRecord::Base
  has_many :announcement_players
  has_many :users, -> { uniq }, through: :announcement_players
end

class AnnouncementPlayer < ActiveRecord::Base
  belongs_to :announcement
  belongs_to :user
end

我认为我需要不同的关系模型(RosterPlayerAnnouncementPlayerTaskPlayer等),因为不同的关系需要不同的属性。例如:AnnouncementPlayer有read?列,TaskPlayer有progress列,RosterPlayer有captain?列。

问题: 确保AnnouncementRoster与其复制的Roster“同步”的最佳方法是什么?换句话说,如果复制的Roster's数据已更改(添加或删除用户),则相应的AnnouncementRoster应相应更新。

1 个答案:

答案 0 :(得分:1)

您想要决定的策略是:

  1. 使用数据库级别的惯用法将这些更新级联(隐藏在rails中)
  2. 使用after_saveafter_update,让Rails推送更改
  3. 在Rails中创建非自动方法(rake任务)以在cron上推送更新
  4. 使用生成bash和cron控制的SQL脚本推送更改(或类似地,将鸽子发送更改)
  5. 您选择的其中一项实际上取决于您的环境,应用程序指标,弹性等。

    对不起,这是一个概述答案。其他人可以通过赞成这方面的内容进行讨论,并根据尚未说明的信息帮助您做出决定。