2012-10-25 69 views
1

我已經建立了一個查找表,在我的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)這是最好的方法嗎?

我有一個看看這些和其他做題,但都不是真的是我要找:

Rails Polymorphic with Lookup Table

Implementing a lookup table in Rails

編輯 確定該作品,但它看起來並不是正確的解決方案。有沒有人有更好的方式來做到這一點?

@status = Lookup.where(:id => @course.status).pluck(:lookup_text)[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 
+0

感謝您的回答。我明白這是一個有趣的方法! – ardochhigh

+0

如果只聲明belongs_to,如下所示:'class Course; belongs_to:status,class_name:'Lookup';結束「,然後:'Course.first.status.lookup_text'。您還可以在查找表上定義範圍以檢索特定表/字段對的好查找行。 – 907th

+0

請參閱編輯後。你可以走得更遠,並且可以在沒有明確的'.lookup_text'部分(僅僅是'Course.first.status'# - >'Active')的情況下訪問'status'字段,這會讓你的代碼更加乾爽。 – 907th