0

我在控制器中编写了这段代码:

def list
  @codes = Code.order("created_at")
  @languages = Language.order('name').collect {|l| [l.name, l.coderay]}

@codes是一个帖子数组。每个代码都有language字段cpptext字符串。它包含 coderay 令牌。
@languages是格式的编程语言数组['C++', 'cpp'], ['Plain Text', 'text']
换句话说,格式Language:name, :coderay. 我只在视图中使用它来制作选择框。所以我使用 :coderay 作为主键,但是 ruby:id​​ 为这个模型添加了自己的 PK。并且这些模型没有关联。

IDE 给我写了这个警告:

控制器操作应该调用一个模型方法而不是初始 find 或 new
如果控制器操作在初始 .find 或 .new 之后包含多个模型方法调用,则此检查会发出警告。建议您在模型类内部实现所有业务逻辑,并使用单一方法访问它

解决此问题的最佳解决方案是什么?
1)在and之间添加1-to-m链接CodesLanguage进行:coderayPK。
2) 忽略此警告
3) 移至Language.order('name').collect {|l| [l.name, l.coderay]}查看。

我认为最好的解决方案是(1),我该怎么做?

4

2 回答 2

2

如果您只需要一次选择,则 3 在这种情况下是最好的

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { :include_blank => true })

Rails 文档中的示例

并且不要创建您的业务逻辑不需要的关联。

于 2012-06-30T14:27:00.847 回答
1

Language您可以实施选项 1 以在您的和之间添加一对一的链接,Code方法是使用属于并设置外键。

代码.rb

belongs_to :language, foreign_key: 'coderay', primary_key: 'language'

语言.rb

has_many :codes, foreign_key: 'coderay', primary_key: 'language'

但是,如果您想为选择框加载静态数据,我通常更喜欢从控制器中的 before_filter 执行此操作并将其传递给视图。

您可能还喜欢decent_exposure宝石。- https://github.com/voxdolo/decent_exposure

于 2012-06-30T14:37:42.540 回答