我在控制器中写了这段代码:
def list
@codes = Code.order("created_at")
@languages = Language.order('name').collect {|l| [l.name, l.coderay]}
@codes
是一系列帖子。每个代码都有language
或cpp
字符串的text
字段。它包含代码令牌
@languages
是格式为['C++', 'cpp'], ['Plain Text', 'text']
的编程语言数组
换句话说,Language
的格式为:name, :coderay
。我只是为了制作选择框而使用它。
所以我使用:coderay作为主键,但ruby将自己的PK :id
添加到此模型中。这些模型没有联系。
IDE给我写了这个警告:
控制器操作应该调用除初始之外的一个模型方法 找到或新的 如果是控制器,此检查会发出警告 action初始化后包含多个模型方法调用 .find或.new。建议您实现所有业务逻辑 在模型类中,并使用单个方法来访问它
解决这个问题的最佳解决方案是什么?
1)在Codes
和Language
之间添加1到m的链接,并使:coderay
PK。
2)忽略此警告
3)移动Language.order('name').collect {|l| [l.name, l.coderay]}
进行查看。
我认为最好的解决方案是(1),我该怎么做?
答案 0 :(得分:2)
3就是最好的
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })
来自rails文档的示例
并且不要为您的业务逻辑创建您不需要的关联。
答案 1 :(得分:1)
您可以通过使用属于,并设置外键,实现选项1在Language
和Code
之间添加1对1链接。
code.rb
belongs_to :language, foreign_key: 'coderay', primary_key: 'language'
language.rb
has_many :codes, foreign_key: 'coderay', primary_key: 'language'
但是,如果要为选择框加载静态数据,我通常更喜欢从控制器中的before_filter执行此操作,并将其传递给视图。
你可能也喜欢decent_exposure
宝石。 - https://github.com/voxdolo/decent_exposure