无法正确检索查找值

时间:2012-10-25 14:17:32

标签: ruby-on-rails lookup polymorphic-associations

我在Rails应用程序中构建了一个查找表。

这是一个存储下拉选取器或可能的复选框的查找文本值的表。我希望查找表具有关联的视图,以便可以轻松编辑值。我也可能希望将来在单个字段的多个模型之间共享查找值。

到目前为止,我已经设法让它用于选择值,但是在节目或索引视图上再次显示文本值一直存在问题。

这就是我构建查找表的方法

rails g scaffold Lookup field_name lookup_text table_name note

在edit.html.erb中有一个字段查找,我有这样的代码,它可以工作,并允许我从列表中选择。

<div class="field">
    <%= f.label :status %><br />
    <%= f.collection_select :status, Lookup.find(:all,:conditions => ["table_name = 'course' and field_name = 'status'"]), :id, :lookup_text, include_blank: true,:prompt => "Status" %>
</div>

一切正常。当我尝试将其显示回来时,我找不到正确的语法。我发现的最好的是: (在控制器中)

@status = Lookup.where(:id => @course.status).pluck(:lookup_text)

(在视图中)

<p>
  <b>Status:</b>
  <%= @status %>
</p>

我想我得到了整个对象。它显示如下:

状态:[“有效”]

我的问题是: (1)如何仅显示值? (2)这是最好的方法吗?

我已经看过这些以及其他SO问题,但没有一个是我真正想要的:

Rails Polymorphic with Lookup Table

Implementing a lookup table in Rails

修改 好的,这有效,但它看起来不是正确的解决方案。有人有更好的方法吗?

@status = Lookup.where(:id => @course.status).pluck(:lookup_text)[0]

1 个答案:

答案 0 :(得分:1)

显示值的另一种方法是@status = Lookup.find(@course.status).lookup_text

为什么不尝试使用不同的查找类:

class CourseStatus < ActiveRecord::Base
  set_table_name "lookups"
  default_scope where("table_name = 'course' and field_name = 'status'")
end

class Course
  belongs_to :course_status
end

然后您可以使用:

CourseStatus.all # e.g. to fill select options
Course.first.course_status.lookup_text # => "Active" or smth else

或没有班级:

class Lookup
  def self._by_table_and_field(table, field)
    ['table_name = ? and field_name = ?', table, field]
  end

  scope :by_table_and_field, lambda { |table, field| 
    where(Lookup._by_table_and_field(table, field))
  }
end

class Course
  belongs_to :status, class_name: 'Lookup', conditions: Lookup._by_table_and_field('course', 'status')
end

Lookup.by_table_and_field('course', 'status').all
Course.first.status.lookup_text