我正在尝试学习RoR,构建我的第一个应用程序,一个基本的库存应用程序。我试过四处寻找,但找不到正确的语法,所以我想我会问。
这是我的设置:
模型
class Item < ActiveRecord::Base
belongs_to :supplier
class Supplier < ActiveRecord::Base
has_many :items
项目控制器
@items = Item.find_all_by_supplier_id '1'
这将返回我想要的数据,但我希望将供应商名称输入到控制器中,这样如果ID不匹配,它仍然可以正常工作。
希望有足够的信息,谢谢!
答案 0 :(得分:18)
您可以反转方法位并尝试:
@items = Supplier.find_by_name('THE NAME').items
Rails创建用于搜索的动态find_by_ *和find_all_by_ *方法。而不是通过supplier_id检索项目,我建议您让rails使用您在上面的代码段中设置的关联为您执行此操作。在内部,这仍然使用supplier_id,但rails正在处理该过程而不是您。
这也是可能的,所以如果您有一个项目并想要供应商,您可以这样做:
Item.find(1).supplier
答案 1 :(得分:0)
@items = Item.joins(:suplier).where(:suplier => { :name => "Suplier name" })
答案 2 :(得分:0)
#include <iostream>
#include <memory>
template<class Dest, class Source, class Deleter>
auto
make_proxy_deleter(std::unique_ptr<Source, Deleter>& source)
{
return [original = source.get_deleter()](Dest* p) {
original(dynamic_cast<Source*>(p));
};
}
template<class Dest, class T, class Deleter>
auto
dynamic_cast_unique(std::unique_ptr<T, Deleter>&& source)
{
auto proxy_deleter = make_proxy_deleter<Dest>(source);
auto p = dynamic_cast<Dest*>(source.get());
if (!p) {
return std::unique_ptr<Dest, decltype(proxy_deleter)>(nullptr,
std::move(proxy_deleter));
// or... throw std::invalid_argument("not convertible");
}
return std::unique_ptr<Dest, decltype(proxy_deleter)>(dynamic_cast<Dest*>(source.release()),
std::move(proxy_deleter));
}
struct A {
virtual ~A() {};
};
struct B {
virtual ~B() {};
};
struct C: A, B {};
using namespace std;
auto main() -> int
{
auto pa = make_unique<C>();
auto pb = dynamic_cast_unique<B>(std::move(pa));
return 0;
}
其中Supplier.find_by_colname(params[:name])
是colname
的名称,我们要在其中检查参数值。在rails中,我们可以使用Supplier table column
添加列名称,如上所示,rails将显示它的魔力;)。以下是Doc