如何向多个has_many关联添加新条目?

时间:2010-05-05 06:35:58

标签: ruby-on-rails activerecord relationship has-many

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

我有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. 如何添加新活动?
  4. 我很抱歉这么久的问题。我不太了解处理这种数据结构的rails方式。谢谢你们回答我。 :)

1 个答案:

答案 0 :(得分:2)

这看起来像has_many :through的作业(向下滚动以找到:through选项)

如果您需要知道创建该事件的用户,那么您应该指定该事件确实只属于某个用户:

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

迁移与您为AccountUser撰写的迁移相同。对于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.buildEvent.new

帐户上的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

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

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

问候,祝你好运!