0

我不确定我做这些是否正确。

我有 3 个模型,帐户、用户和事件。

帐户包含一组用户。每个用户都有自己的登录用户名和密码,但他们可以访问同一帐户下的相同帐户数据。

事件由用户创建,同一帐户中的其他用户也可以阅读或编辑它。

我创建了以下迁移和模型。


用户迁移

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.integer     :account_id
      t.string      :username
      t.string      :password
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

账户迁移

class CreateAccounts < ActiveRecord::Migration
  def self.up
    create_table :accounts do |t|
      t.string      :name
      t.timestamps
    end
  end

  def self.down
    drop_table :accounts
  end
end

事件迁移

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
      t.integer     :account_id
      t.integer     :user_id
      t.string      :name
      t.string      :location
      t.timestamps
    end
  end

  def self.down
    drop_table :events
  end
end

账户模式

class Account < ActiveRecord::Base
  has_many      :users
  has_many      :events
end

用户模型

class User < ActiveRecord::Base
  belongs_to    :account
end

事件模型

class Event < ActiveRecord::Base
  belongs_to    :account
  belongs_to    :user
end

所以....

  1. 这个设置正确吗?
  2. 每次用户创建新帐户时,系统都会询问用户信息,例如用户名和密码。如何将它们添加到正确的表中?
  3. 如何添加新活动?

我很抱歉问了这么长的问题。我不太了解处理这种数据结构的rails方式。谢谢你们回答我。:)

4

1 回答 1

2

这看起来像是has_many 的工作:通过(向下滚动以查找:through选项)

如果你需要知道创建事件的用户,那么你应该指定 Event 真的只属于一个用户:

class Event < ActiveRecord::Base
  belongs_to    :user
end

但是,帐户可以“获取”其用户的事件。您可以这样指定:

class User < ActiveRecord::Base
  belongs_to :account
end

class Account < ActiveRecord::Base
  has_many :users
  has_many :events, :through => :users
end

迁移将与您为Account和编写的相同User。因为Event您可以删除account_id

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
      t.integer     :user_id
      t.string      :name
      t.string      :location
      t.timestamps
    end
  end

  def self.down
    drop_table :events
  end
end

然后可以像这样创建您的事件:

# These two are equivalent:
event = user.events.create(:name => 'foo', :location => 'bar')
event = Event.create(:user_id => user.id, :name => 'foo', :location => 'bar')

请注意,这将立即创建并保存事件。如果您想创建事件而不保存它,您可以使用user.events.buildorEvent.new代替。

on Accounts将has_many :through允许您获取一个帐户的所有事件:

user.events         # returns the events created by one user
account.events      # returns all the events created by the users of one account
user.account.events # returns the events for the user's account

最后一点,请注意你在这里重复了很多轮子。管理用户和权限有很多很好的解决方案。

我建议您查看用于管理您的帐户的 devise ( railscast ) 或 authlogic ( railscast ),以及用于管理权限declarative_authorization ( railscast )cancan ( railscast ) 我个人的选择是设计和声明授权。前者比authlogic更容易安装,后者比cancan更强大。

问候,祝你好运!

于 2010-05-05T09:18:31.580 回答