小编ric*_*ard的帖子

在Rails中动态创建模型和/或表

我正在研究一个项目,这个项目有一个非常不寻常的要求,我希望得到一些关于处理它的最佳方法的建议,甚至是一些可以帮助我构建解决方案的信息指针.

好的,所以这就是我需要做的.应用程序存储和管理各种类型的媒体文件,但应用程序的每个部署对媒体文件具有完全不同的元数据要求.

此元数据可以包含任意数量的不同类型的字段(单行文本,多行文本,复选框,选定值等),并且还经常需要验证特别是存在和唯一性验证.

应用程序需要能够轻松检索值,最重要的是必须能够处理这些字段的完整搜索功能.

我考虑的一个选项是使用属性列表排列,其中数据库表只包含每个媒体文件的每个元数据字段的属性名称和值.但是,在对此解决方案进行原型设计时,很快就会发现它对搜索和检索记录的效率不高,特别是当数据库可能相当大时,例如最近的部署有3000个媒体文件,并且有超过20个元数据领域.此外,快速搜索和检索相关记录的查询变得非常复杂.

系统当前使用的另一个选项是预先定义元数据配置,并在部署期间运行迁移以创建具有标准名称的表和模型,以便媒体模型可以与系统然后使用它相关联.这通常很好,但它确实会导致一些重要的部署和测试问题.

例如,如果在部署之前不知道配置,则编写单元测试会变得更具挑战性.虽然我可以编写示例配置并以这种方式测试代码,但它不允许我测试特定部署的特定要求.

同样,在开发中,它目前要求我将配置中的迁移复制到主文件夹,运行它,执行所有测试和开发,然后我必须记住回滚并从主文件夹中删除该迁移,以便应用程序处于标准状态.当我修复bug时,这尤其具有挑战性,我需要将应用程序放在特定的配置中以进行测试和调试.试图在各种配置之间切换成为一场真正的噩梦.

理想情况下,我希望能够在启动服务器时从配置文件动态创建表和模型,包括验证等.更好的是,如果我可以在一个数据库中维护多个元数据设置,每个元数据设置都有自己的表,那么我需要做的就是更改应用程序当前正在使用的配置文件.

我确信这可以通过Rails完成,但是我能够找到的信息非常少,可以指出我在过去几天的研究过程中如何构建它的正确方向所以任何帮助或建议非常感谢!

model ruby-on-rails dynamic

12
推荐指数
1
解决办法
2740
查看次数

Rails存在验证在值0上失败

我有一个类似于以下的模型,

class Activity < ActiveRecord::Base
    attr_accessible :name, :admin

    validates :name, :presence => true
    validates :admin, :presence => true
end 
Run Code Online (Sandbox Code Playgroud)

name属性是一个字符串,admin属性在迁移中定义为boolean.

如果我尝试在控制台中使用创建模型的实例,

a = Activity.create(:name => 'Test', :admin => 0)
Run Code Online (Sandbox Code Playgroud)

然后验证失败,说我需要为Admin提供一个值.为什么?我提供了一个值.

我能理解,如果我没有提供任何价值,或者我提供了零.但为什么像0这样的值(或者甚至是假的)会导致验证失败?

validation ruby-on-rails

10
推荐指数
1
解决办法
3214
查看次数

Rails验证非模型

我只是想知道什么是推荐的方法来验证基于模型的表单.我同意通常所有验证都应该在模型中完成,但有些情况下特定的表单可能没有相应的模型.例如,任意搜索表单.

根据我目前的研究,据我所知,有两种主要方法可以做到,

  1. 在控制器中验证.
    • 是否可以在控制器中使用Rails验证?我真的更愿意在我自己的自定义代码上使用它们.

  2. 创建一个任意类,例如.叫做SearchForm并包括ActiveRecord::Validations
    • 该类应该与模型一起存储(即使它不是真的)?
    • 推荐这种方法的帖子表明你必须为ActiveRecord隐藏一堆方法,比如save,save!,update_attribute等.这让我觉得不是很像Rubyesque!

  3. 还有其他建议吗?

validation ruby-on-rails

10
推荐指数
1
解决办法
2267
查看次数

ElasticBeanstalk - 将ec2-user添加到另一个组

我有一个需要ec2-user在我的EC2实例上运行的cron作业,它需要能够写入我的Web应用程序的标准日志文件.但是,日志文件由webapp(按照正常情况下)拥有.

我已成功更改了日志文件的权限,以便所有者和组都可以访问它们webapp:webapp.但是当我遇到麻烦的时候,我试图将其添加ec2-userwebapp组中.

我可以在SSH中做得很好sudo usermod -a -G webapp ec2-user但是当我尝试通过EB 容器命令添加此命令时,我得到一个错误说you must have a tty to run sudo.没有sudo运行命令给了我/bin/sh: usermod: command not found.

任何人都知道有任何其他方式可以通过Elastic Beanstalk部署配置添加ec2-userwebapp组中.

linux amazon-ec2 amazon-web-services amazon-elastic-beanstalk

9
推荐指数
2
解决办法
1537
查看次数

在UIScrollView中动态添加的子视图未显示

我在向UIScrollView动态添加子视图时遇到了很多麻烦.滚动视图适用于在NIB中创建的内容,但由于要显示的子视图取决于我的应用程序中的数据(图像,标签,单选按钮等的混合),我需要能够动态创建和显示它们.

根据我读过的所有内容,它在各种网站和Apple文档中看起来非常简单.在视图控制器的viewDidLoad中,我添加了以下代码,

UILabel *testLabel = [[UILabel alloc] init];
[testLabel setFrame:CGRectMake(50, 50, 100, 40)];
[testLabel setText:@"My Test label"];
[scrollView addSubview:testLabel];

[testLabel release];
Run Code Online (Sandbox Code Playgroud)

标签根本不会出现在滚动视图中,但如果我将testLabel添加到self.view,则会出现(但显然不在滚动内容中).我甚至尝试将代码添加到viewDidAppear,以防我误解了没有运气的事件顺序.

当我检查调试器时,我注意到滚动视图的地址是0x0,我认为这意味着它由于某种原因而无效,这可以解释为什么它不起作用.我假设如果我将此scrollView指针连接到IB中的实际滚动视图,它将自动分配正确的地址.这是不正确的?如果是这种情况,我该如何获取视图的地址?

- 更新 -
感谢所有反馈.我按照每个人的建议检查了一切,这当然都是正确的.我不需要设置内容的大小,因为我在NIB中有一些其他虚拟标签(用于测试滚动工作).但我会记得以后:-)

有趣的是,在再次检查代码并且没有进行任何更改之后,我再次运行它并且它刚刚起作用!! 不知道为什么,但我会发布原因,如果我弄清楚...

iphone ios

7
推荐指数
1
解决办法
1万
查看次数

更改ngRepeat的步长

我有一个现有的HTML模板,使用ngRepeat在页面上放置切片,

<div ng-repeat="product in productList">
    <div class="product-tile">
       Product content goes here...
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

设计师现在需要将每3个瓷砖包裹在额外的div中.

通常,我会循环遍历列表,或者,

  • 每个循环由3个项目组成,在单个迭代中包含div中的3个tile,测试是否存在第2个和第3个元素(当列表长度不是3的倍数时)
  • 或者像往常一样逐步浏览列表并检查项目的索引.如果3的mod等于0,我会添加额外的div标签

但我无法看到我在Angular中的表现.有关如何处理这个的任何建议?

html angularjs

6
推荐指数
1
解决办法
3564
查看次数

使用sed将文件中的字符串替换为该名称的变量内容

我正在尝试使用sed将%XXX%形式的文件中的模板字符串替换为我的shell脚本中名为XXX的变量的值.

例如,以下工作完美

sed "s/%user_home%/$user_home/gi"
Run Code Online (Sandbox Code Playgroud)

所以,如果user_home=fred以下,

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName %server_name%

  ErrorLog /var/log/apache2/%user_home%_webapp_error.log
  CustomLog /var/log/apache2/%user_home%_webapp.log common

  DocumentRoot /home/%user_home%/web_app/public
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

变,

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName %server_name%

  ErrorLog /var/log/apache2/fred_webapp_error.log
  CustomLog /var/log/apache2/fred_webapp.log common

  DocumentRoot /home/fred/web_app/public
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

问题是我想在没有事先明确知道模板字符串及其变量的情况下运行sed命令.也就是说,它会查找%XXX%,然后用$ XXX的内容替换它,而不关心变量的实际名称是什么.

我知道它与后引用有关但我无法弄清楚如何使用后引用的内容作为变量名.

我试过了,

sed "s/%\([a-z_]\)%/$(\1)/gi"
Run Code Online (Sandbox Code Playgroud)

但这没有奏效,因为它似乎是在寻找一个名为$\1的变量.

regex bash sed

5
推荐指数
1
解决办法
8883
查看次数

Rails虚拟模型中属性的本地化

我在Rails 3中创建了一个虚拟(非持久)模型(见下文)

我现在需要将翻译应用于模型,但标准翻译位置似乎不起作用.例如

en:
  activerecord:
    attributes:
      media_upload:
        title: "My Title"
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用可选的字符串参数将其直接应用于标签,例如.f.label :title, t('activerecord.attributes.media_upload') 但这不适用于验证产生的错误消息.类似地,我可以像Rails中的Localize嵌套虚拟属性中所建议的那样为标签助手的翻译文件添加一个键,但这也无法用于验证.

helpers:
  label:
    media_upload:
      title: "My Title"
Run Code Online (Sandbox Code Playgroud)

除了重新定义所有相关的验证消息之外,还有其他方法可以在非持久性模型中进行属性本地化吗?

样本模型如下所示,

class MediaUpload
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :media_file, :title

  validates_presence_of :media_file
  validates_presence_of :title

  def initialize(attributes = {})
    unless attributes.nil?
      attributes.each do |name, value|
        send("#{name}=", value)
      end
    end
  end

  def persisted?
    false
  end
end
Run Code Online (Sandbox Code Playgroud)

localization ruby-on-rails ruby-on-rails-3 rails-i18n

4
推荐指数
1
解决办法
675
查看次数

Rails包含验证

我正在努力进行以下包含验证,

class User < ActiveRecord::Base
  attr_accessible :language

  validates :language, :presence => true, :inclusion => { :in => I18n.available_locales.join(' ')}
end
Run Code Online (Sandbox Code Playgroud)

如果我在控制台中运行它,

u = User.new
u.valid?
Run Code Online (Sandbox Code Playgroud)

然后我得到一个TypeError: can't convert nil into Stringinclude?的方法active_model/validations/inclusion.rb.

但是,如果我将验证行更改为,

validates :language, :presence => true, :inclusion => { :in => %(en fr es)}
Run Code Online (Sandbox Code Playgroud)

然后验证按预期工作.如果语言是nil或不是列表中的其中一个条目,那么它是无效的,并且没有崩溃.

我已经逐步完成了代码,以验证它是否正在生成包含列表,就是这样.那它为什么会崩溃?存在验证是否应该解决问题并阻止进一步验证?当我生成列表而不是硬编码值时,为什么会崩溃?

我甚至尝试使用proc形式:in来查看是否有任何区别,但事实并非如此.但是我真的不希望这是需要的,因为我只想在应用程序加载时生成一次列表,因为I18n.available_locales在应用程序执行期间永远不会改变.

更新:我有一个想法并测试了以下代码,

class User < ActiveRecord::Base
  attr_accessible :language

  validates :language, :presence => true, :inclusion => { :in => ['en','fr','es'].join(' ') }
end
Run Code Online (Sandbox Code Playgroud)

此代码也会生成相同的错误,因此问题不在于I18n或类似的问题.它与%(en fr …

validation ruby-on-rails inclusion

3
推荐指数
2
解决办法
2万
查看次数

动态确定Rails模型属性

我有一个模型(下面的简化版本-全一个有很多更多的字段)上,我想做一个搜索.

class Media < ActiveRecord::Base

  attr_accessible :subject, :title, :ref_code

  validates :title, :presence => true
  validates :subject, :presence => true

  def self.search(terms_hash)
    return if terms_hash.blank?

    composed_scope = self.scoped

    terms_hash.each_pair do |key, value|
    if self.respond_to? key and not value.is_blank?
      value.split(' ').each do |term|
        term = "%#{term}%"
        composed_scope = composed_scope.where("#{key} LIKE ?", term)
      end
    end
    composed_scope
  end
end
Run Code Online (Sandbox Code Playgroud)

由于高级搜索表单几乎与用于创建/更新模型实例的表单相同,我想创建一个方法,动态查看请求的参数列表,并通过名称将表单字段与模型属性进行匹配.所以,如果搜索请求是,

/search?utf8=?&ref_code=111&title=test&subject=code&commit=Search
Run Code Online (Sandbox Code Playgroud)

然后我的控制器可以调用Media.search(params)并返回一个范围,在相应的字段中搜索适当的值.正如您所看到的,我尝试使用respond_to?但是仅为模型的实例而不是实际的模型类定义,我需要忽略与模型无关的任何参数(例如,在这种情况下为utf8和commit).如果这一切都运行良好,我计划重构代码,以便我可以为多个模型重用相同的方法.

有类似的类方法respond_to?吗?你会怎么做同样的任务?

我知道这与在rails 3中动态获取模型属性有关,但它并没有真正回答我正在尝试做的事情,因为我想在模型而不是模型实例上做.

activerecord attributes ruby-on-rails ruby-on-rails-3 rails-activerecord

1
推荐指数
1
解决办法
619
查看次数