您可以尝试使用以下范围:
class Books < ActiveRecord::Base
# .... code ....
scope :personal, proc {|user| where(:instance_id => user.instance_id) }
# .... code ...
end
现在你可以这样做:
@personal_books = Books.personal(@user)
您可以在此处阅读有关范围的更多信息:http ://www.railsdispatch.com/posts/rails-3-makes-life-better (向下滚动一点)
另一种方法是建立一个像
用户 has_many Books 通过 Instance
然后,您将有一个额外的旧表将用户映射到他们的实例上的书籍。这是一个 n:m 关系。所以一本书可能属于多个实例。
它看起来像这样:
用户表:
用户(姓名、电子邮件、密码、instance_id 等...)
书表:
Books (name, desc) # no more instance_id !
映射表:
作业(instance_id、book_id)
你的模型看起来像:
class Assignment < ActiveRecord::Base
belongs_to :book # foreign key - book_id
belongs_to :instance # foreign key - instance_id
end
class Instance < ActiveRecord::Base
has_many :assignments
has_many :books, :through => :assignments
end
class Books < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end
class User < ActiveRecord::Base
belongs_to :instance
end
获取用户实例的所有书籍的代码如下所示:
@user = User.find(:first)
@books = @user.instance.books.find(:all)
(我建议你阅读http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)
编辑
如果一本书总是只属于一个实例,你可以试试这个:
class User < ActiveRecord::Base
belongs_to :instance
end
class Instance < ActiveRecord::Base
has_many :users
has_many :books
end
class Books < ActiveRecord::Base
belongs_to :instance
end
因此,您获取用户的书籍,例如:
@user.instance.books.find(:all)