我不确定我是否正确这些。
我有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
左右....
我很抱歉这么久的问题。我不太了解处理这种数据结构的rails方式。谢谢你们回答我。 :)
答案 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
迁移与您为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.build
或Event.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
作为最后一点,请注意你在这里重新发明了很多轮子。有很好的解决方案来管理用户和权限。
我建议您查看devise(railscast)或authlogic(railscast)来管理您的帐户,declarative_authorization({{ 3}})或railscast(cancan)用于管理权限。我个人的选择是设计和声明授权。前者比authlogic更容易安装,后者比cancan更强大。
问候,祝你好运!