ruby - 将查询从 View 移动到模型

标签 ruby ruby-on-rails-3

我有两个非附加模型 - 里程碑和用户。 (我的里程碑其实属于公司,公司有很多里程碑。)

每个里程碑都有一个负责它的用户 - 在我的里程碑表单中,我使用以下内容来查找和选择用户:

<%= f.input :milestone_user, :as => :select, :collection => User.find(:all, :order => "name ASC") %>

这给了我一个 user_id,我在一个 View 中将其转换为如下名称:

<%= User.find(milestone.milestone_user).name %>

这很好用,但我现在想在几个 View 中使用它,不喜欢在我的 View 中使用查询。

我曾尝试将它移到我的用户模型中,但我不知道该怎么做。我在模型中试过这个:

  scope :username, lambda { where("id = milestone_user")}

在我看来:

<%= User.username.first_name %>

但是它提示 first_name 的未定义方法..

提前致谢

最佳答案

将此添加到您的 Milestone 模型:

def username
  User.find(milestone_user).try :name
end

并在您的 View 中像这样使用它:

<%= milestone.username %>

但这效率不高,更好的方法是将 belongs_to :user, :foreign_key => "milestone_user", :class_name => "User" 放在 Milestone模型。您不必填写关联,您仍然可以在没有指定用户的情况下创建里程碑。

belongs_to 还允许您在 View 中使用这样的代码:

<%= milestone.user.name %>

无需为您想要访问的每个用户属性创建额外的方法。

关于ruby - 将查询从 View 移动到模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7214382/

相关文章:

ruby-on-rails - 通过两个关系识别模型实例

Ruby Hash 检查是子集?

ruby - Rails - 局部变量与实例变量

ruby-on-rails - 捆绑执行 rake db :migrate -- schema. rb 重新生成,没有索引

ruby-on-rails - 使用 capistrano 部署时隐藏 mysql2 密码的好方法是什么

mysql - rails update_all 字段并将计数递增 1

ruby - 从街道地址中剥离街道号码

Ruby WeakRef 具有隐式竞争条件?

ruby - 在 Ruby 中,如何在文件中的另一行之后添加一行?

ruby-on-rails - Rails 在 ID NOT IN 条件下查找,如何支持映射的空值?