【问题标题】:Establishing a has_many relationship in Rails在 Rails 中建立 has_many 关系
【发布时间】:2009-12-02 17:43:17
【问题描述】:

我在 Rails 中创建应用程序时遇到问题。

此应用程序有两种模型,一种代表公司,另一种代表产品。每家公司都销售零个或多个产品,我希望在模型中捕捉到这种关系。到目前为止,这是我所得到的:

我通过运行生成器创建了模型:

script/generate scaffold company name:string product_id:integer

script/generate scaffold product name:string

我在公司模型中添加了以下行,以表明每个公司可以拥有多个产品:

has_many :products

我在产品模型中添加了以下行:

belongs_to :company

我在 YAML 文件中创建了一些示例数据。这些公司的样本数据是:

microsoft:
  name: Microsoft
  product_id: [1, 3]

google:
  name: Google
  product_id: [2, 4]

产品的样本数据是:

word:
  id: 1
  name: Word

earth
  id: 2
  name: Earth

excel:
  id: 3
  name: Excel

chrome:
  id: 4
  name: Chrome

然后我加载了示例数据:

rake db:fixtures:load

然后我尝试在公司视图中打印公司的所有产品:

<% if @company.product_id %>
<% for product in @company.product_id %>
  <tr>
    <td><%=h product.name %></td>
  </tr>
<% end %>
<% end %>

这是我得到错误的地方。有任何想法吗?我不确定问题是什么。据我所知,这可能与我如何生成模型或建立它们的关系有关。或者可能是我尝试在视图中打印信息的方式。

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller


    【解决方案1】:

    首先,您的字段设置错误。 has_manybelong_to 要求 products 具有 company_id 而不是相反。对于一对多关系,外键总是需要放在等式的“多”一侧。

    然后你想要这个:

    <% for product in @company.products %>
      <tr>
        <td><%=h product.name %></td>
      </tr>
    <% end %>
    

    【讨论】:

    • 这是有道理的。但是,如果我想把钥匙放在等式的“一”边,有没有办法表达这一点,也许通过制作一个钥匙列表?
    • 基本的 RDBMS 设计需要一对多的“多”侧的外键,因为“[某物]列表”在任何现代数据库中都不是列类型。这与 Rails 无关。
    • 好吧,如果你真的,真的,真的想这样做,你可以 ActiveRecord.serialize: rails.rubyonrails.org/classes/ActiveRecord/Base.html#M002284 但它会伤害你并且非常困难。
    • 前面的评论有误。你不想。想要是不可能的。即使你想,你真的,真的,真的不想。
    【解决方案2】:

    你没有说你的错误是什么,但我相信你的 yml 文件不太正确。

    上次我检查时,这是不可能的:

    microsoft:
      name: Microsoft
      product_id: [1, 3]
    

    product_id: "list" 将只接受 "tags" -> Word、Excel。但随后它会生成“奇怪”的 id(使用标签字符串的哈希值)。所以它也不会很好地工作。

    而且,正如其他人所说,如果您将 client_id 放入产品中会容易得多。这就是数据库的工作方式。

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多