在我的应用程序中,我有一个"用户"模型.每个用户可以拥有多个(电子邮件)地址,这些地址在"地址"模型中定义:
Class User < ActiveRecord::Base
has_many :addresses
def is_authorized(op)
# returns true or false
end
def is_owned_by(user)
# returns true or false
end
end
Class Address < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
在AddressController类中,当前登录的用户可在"@user"实例变量中使用.控制器阻止普通用户编辑,删除,查看等不属于他们的地址 - 但他允许管理用户编辑这些地址.如果当前登录的用户正在执行正常或超级用户操作,则AddressController类可以询问AddressModel.
这一切都运行良好,数据库更新按预期进行,但是,我真的希望根据操作模式使用不同的HTML视图.我只能想到两种方法来实现这一目标:
如果可以在两个完全不同的布局中显示执行单个控制器的结果,根据它的操作模式,有什么好的方法可以实现呢?
在此先感谢Stefan
让我们假设三个模型,标准连接:
class Mailbox < ActiveRecord::Base
has_many :addresses
has_many :domains, :through => :addresses
end
class Address < ActiveRecord::Base
belongs_to :mailbox
belongs_to :domain
end
class Domain < ActiveRecord::Base
has_many :addresses
has_many :mailboxes, :through => :addresses
end
Run Code Online (Sandbox Code Playgroud)
现在很明显,如果对于任何给定的邮箱,您想知道它在哪个域中有地址,您有两种可能的方法:
m = Mailbox.first
# either: SELECT DISTINCT domains.id, domains.name FROM "domains" INNER JOIN
# "addresses" ON "domains".id = "addresses".domain_id WHERE
# (("addresses".mailbox_id = 1))
m.domains.all(:select => 'DISTINCT domains.id, domains.name')
# or: SELECT domains.id, domains.name FROM "domains" INNER JOIN "addresses" ON
# "domains".id = "addresses".domain_id WHERE …Run Code Online (Sandbox Code Playgroud)