Ruby on rails Rails双向关联不起作用
我有点问题。我一直在开发Rails应用程序,遇到了一个无法修复的问题 到目前为止,我的应用程序允许用户将产品详细信息输入数据库(存储在“产品表”中)。以下是我正在使用的数据库的模式Ruby on rails Rails双向关联不起作用,ruby-on-rails,ruby,model-associations,Ruby On Rails,Ruby,Model Associations,我有点问题。我一直在开发Rails应用程序,遇到了一个无法修复的问题 到目前为止,我的应用程序允许用户将产品详细信息输入数据库(存储在“产品表”中)。以下是我正在使用的数据库的模式 ActiveRecord::Schema.define(version: 20140126073333) do create_table "ijns", force: true do |t| t.integer "number" t.integer "product_id" t.da
ActiveRecord::Schema.define(version: 20140126073333) do
create_table "ijns", force: true do |t|
t.integer "number"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "quantity"
end
add_index "ijns", ["number"], name: "index_ijns_on_number"
create_table "products", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "ijn_id"
end
add_index "products", ["name"], name: "index_products_on_name"
end
还有另一个名为“ijns”的表,它为每个产品分配一个唯一的标识符。这个ijn并不是故意成为主键的,因为我不希望它是一个自动递增的值
与IJN和产品的关系为:
一个产品有许多ijn和
ijn属于一种产品
这是我的产品模型
class Product < ActiveRecord::Base
has_many :ijns
validates :name, presence: true, length: { minimum: 10 }, uniqueness: true
end
但我无法从产品模型访问“ijns”表的“number”字段
我希望我已经清楚地解释了我的问题。如果需要其他信息,请务必告诉我。急切地等待一些答复!:)
第一次编辑:
当我在sqlite3数据库浏览器中查看我的“products”表时,ijn_id列存在,但由于某些原因,没有条目。以下是一个屏幕截图:
puts Product.first.ijn.number
这应该根据您想要执行的操作来执行。问题是您已经定义了一个
产品有很多:ijns
。这与模式中具有ijn\u id
的产品相冲突
因此,当您尝试执行product.ijn
时,会出现一个错误
编辑:
如果一个产品真的有很多ijn,那么ijn\u id
对ActiveRecord和数据库没有任何意义。他们不知道它应该指的是哪个ijn。我怀疑您希望它指的是分配给产品的最后一个ijn
在这种情况下,一种解决方案是将属性更改为类似于current\ijn\u id
的内容。每次需要更新时,都必须手动指定一个值
或者,您可以执行product.ijns.last
。问题是,您需要确保.last
每次都会为您提供正确的ijn。例如,如果出于某种原因,您将产品“回滚”到旧ijn,则此操作可能不起作用。似乎您正在使此操作变得比您需要的更复杂:
表格
您的ijn
号码就像一个(系统的唯一标识符)对吗?由于它是产品的一个属性,为什么不将其放在products表中:
#products table
id | ijn | name | created_at | updated_at
这立即取消了对额外表的要求(也保存查询)
额外的
如果您想为您的产品
调用额外数据,则需要一个专门用于该数据的表
对我来说,模型
是具有特定目的的数据集合。拥有ijn
的模型并不意味着这一点
#app/models/products.rb
Class Product < ActiveRecord::Base
has_one :profile, class_name: "ProductProfile"
end
#app/models/product_profile.rb
Class ProductProfile < ActiveRecord::Base
belongs_to :product
end
#app/models/products.rb
类产品
这将允许您调用类似于@product.profile.quantity
或类似的内容非常感谢您的帮助。。。我又读了一些书,找到了解决办法。。对于像我这样的一对多关系,您只需要在一侧提供引用表的“id”,即在“ijn”表中包含“product_id”列。我删除了“products”表中的“ijn_id”列,并在“ProductsController”中包含了一行代码。这是:
...
def show
@product = Product.find(params[:id])
#getting the related IJN
@ijn = Ijn.find(:all, :conditions => ['product_id = ?',@product])
end
...
现在,在视图中,只需执行以下操作即可引用关联的产品名称
<% @ijn.map do |i| %>
<tr>
<td><%=i.number %></td>
<td><%= i.quantity %></td>
<td><%= i.name %></td> #this returs the assocaiated product name
<td><%= Date::MONTHNAMES[i.product.created_at.month] %></td>
<td>placeholder</td>
<td>placeholder</td>
</tr>
<% end %>
#这将返回关联的产品名称
占位符
占位符
返回产品名称和相关ijn的列表。我没有在上面的代码中添加任何样式
我希望这能帮助其他面临类似问题的人。您尝试过什么?如果你写@product.ijns
,你会得到什么?一个nomethoderor
或者别的什么?是的,罗宾,我得到了一个nomethoderor嘿@murrekatt,我试过了,但又得到了:“nomethoderor:undefined method`ijn'for#”是的,我就是这么想的。。我试过做产品。我的id。。那也不行。。好啊你建议我怎么解决这个问题?我需要带桌子的双向通道。。ijn.product.name正在工作。。我需要“product.ijn.number”…使关联一致。那么一个产品是有一个还是有多个Ijn
s呢?如果有,将has\u many
更改为has\u one
。ActiveRecord关联基础:好的,让我在这里澄清一下。产品模型的实例只能有一个IJN,而IJN模型的实例只能有一个产品。但是,同样的产品也可以在应用程序的生命周期中分配另一个IJN。这不意味着一个产品有很多IJN吗?当产品被分配一个新的IJN时会发生什么,旧的IJN会被丢弃吗?如果是这样,有一个是合适的。如果不是,即产品随时间累积ijn,则使用有许多
。。是后者。。随着时间的推移,产品会累积IJN s。这就是为什么我用了很多联想。正如我所说,它从IJN端工作,ie IJN.product.name返回与IJN关联的产品的名称,但是product.IJN.number只返回一个NoMethodError。此外,ijn_id不会在产品表中更新,如上图所示。是的,我也这么认为。。这就是为什么当我决定db应该采用的结构时,我决定将我的产品放在一个单独的表中,因为它允许在我需要向产品模型添加更多属性的情况下扩展我的应用程序。。。这就是我使用两个独立表格的基本原因。此外,由于产品在整个应用程序生命周期中将不断被赋予IJN的新的独特价值,因此最好将其放在自己的表中。
...
def show
@product = Product.find(params[:id])
#getting the related IJN
@ijn = Ijn.find(:all, :conditions => ['product_id = ?',@product])
end
...
<% @ijn.map do |i| %>
<tr>
<td><%=i.number %></td>
<td><%= i.quantity %></td>
<td><%= i.name %></td> #this returs the assocaiated product name
<td><%= Date::MONTHNAMES[i.product.created_at.month] %></td>
<td>placeholder</td>
<td>placeholder</td>
</tr>
<% end %>