嵌套,这是我需要的吗?

时间:2012-11-05 19:08:57

标签: ruby-on-rails ruby-on-rails-3

项目有用户。 用户有费用。

我有一个当前登录用户的屏幕添加新费用,我的控制器基于current_user强制用户密钥。

现在我需要允许用户在特定项目中工作,并一次性输入该项目的费用,基本上“输入”项目费用屏幕,以限制该屏幕中显示的费用范围他们选择的项目。

(类似于basecamp让你选择一个你工作的项目的方式)

我确实希望将此视图用于其他内容,并希望尽可能将其视为DRY。

只是想知道,让用户选择项目的正确方法是什么,然后通过使用我现有的费用屏幕来坚持这个选择。

编辑 - 我希望能够选择一个项目,然后让费用页面上的所有功能都通过该项目传递给控制器​​方法。

所以我最终可以使用/ project / 45 /费用等等

谢谢!

class Project < ActiveRecord::Base
  attr_accessible :name, :active

    has_many :expenses, foreign_key: :project_id

end

class Expense < ActiveRecord::Base
  attr_accessible :amount, :expense_date, :project_id, :expense_type_id, :user_id

  belongs_to :project
    belongs_to :user
    belongs_to :expense_type
    has_one :expense_approval

end

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me

  has_many :expenses, foreign_key: :user_id
end

1 个答案:

答案 0 :(得分:1)

你有一套稍微复杂的关系。现在,您必须考虑应用程序中需要的查询语义。

记住你原来的帖子主题'嵌套......需要吗?'

这取决于您在应用中喜欢的各种查询语义。

最明显的'嵌套'关系是:

class Project < ActiveRecord::Base
  attr_accessible :name, :active
  has_many :expenses, foreign_key: :project_id
end

因此,如果在您的应用中,只查询属于项目的费用,您可以考虑创建嵌套路由,即:。

配置/ routes.rb中:

resources :project do
  resources :expense
end

假设这是您应用中的唯一路线。引用任何费用的唯一方法是通过它所属的项目来完成。所以这个查询可用:

GET /project/101/expenses # index all expenses for project with id 101

但是,请查看使用routes.rb中的上述条目生成的NUMEROUS路由。要查看,使用'routes.rb'中包含的上述嵌套路由运行'rake routes',然后从'routes.rb'中删除上述条目并再次运行'rake routes'。

嵌套路线会添加很多路线。它可能会添加您不需要的许多路线。如果是这种情况,您可能想采取不同的方法。不要使用嵌套路线,而是使用HAND CRAFT只需要您真正需要的路线。